📄 socket.cpp
字号:
#include <unistd.h> /* close */#include <string.h> /* strerror */#include <strings.h> /* bzero */#include <errno.h> /* extern int errno */#include <sys/socket.h> /* socket, bind, listen, etc. */#include <netdb.h> //gethostbyname()#include <arpa/inet.h> //inet_ntoa()#include "Socket.h"#include "Logger.h"const UInt MaxLength=65535;Socket::Socket(){ _sockfd=-1; _sockfd_cli=-1; _fd=-1; _port=0; _host=NULL;}Socket::~Socket(){}void Socket::ClientInit(char* sAddr, char* sPort){ _host=gethostbyname(sAddr); if(_host == NULL) { Logger::debug("In gethostbyname error!"); exit(1); } _port=atoi(sPort); if(_port < 0) { Logger::debug("Get port error!"); exit(1); } bzero(& _server_addr, sizeof( _server_addr)); _server_addr.sin_family=AF_INET; _server_addr.sin_addr=*(struct in_addr *)_host->h_addr; _server_addr.sin_port=htons(_port);}void Socket::ServerInit(char* sPort){ _host=gethostbyname(sPort); if(_host == NULL) { Logger::debug("In gethostbyname error!"); exit(1); } _port=atoi(sPort); if(_port < 0) { Logger::debug("Get port error!"); exit(1); } bzero(&_server_addr, sizeof(_server_addr)); _server_addr.sin_family=AF_INET; _server_addr.sin_addr.s_addr=htonl(INADDR_ANY); _server_addr.sin_port=htons(_port);}void Socket::Sock(){ _sockfd=socket(AF_INET, SOCK_STREAM, 0); if(_sockfd < 0) { Logger::debug("In socket error: %s", strerror(errno)); exit(1); }}void Socket::Connect(){ int ret; ret=connect(_sockfd, (struct sockaddr*) &_server_addr, sizeof(struct sockaddr)); if(ret < 0) { Logger::debug("In connect error: %s", strerror(errno)); close(_sockfd); exit(1); } _fd=_sockfd;}void Socket::Bind(){ int ret; int in=1; //setsockopt to avoid meeting error "Address already in use" ret=setsockopt(_sockfd, SOL_SOCKET, SO_REUSEADDR,&in,sizeof(in)); if(ret < 0) { Logger::debug("In connect error: %s", strerror(errno)); close(_sockfd); exit(1); } ret=bind(_sockfd, (struct sockaddr*) &_server_addr, sizeof(struct sockaddr)); if(ret < 0) { Logger::debug("In connect error: %s", strerror(errno)); close(_sockfd); exit(1); }}void Socket::Listen(int maxListen){ int ret; ret=listen(_sockfd, maxListen); if(ret < 0) { Logger::debug("In connect error: %s", strerror(errno)); close(_sockfd); exit(1); }}void Socket::Accept(){ size_t size_in; size_in=sizeof(struct sockaddr); _sockfd_cli=accept(_sockfd, (struct sockaddr*) &_client_addr, &size_in); if(_sockfd_cli < 0) { Logger::debug("In connect error: %s", strerror(errno)); close(_sockfd); exit(1); } Logger::debug("Server get connection from %s", inet_ntoa(_client_addr.sin_addr)); Logger::log(L_ERR, "Server get connection from %s", inet_ntoa(_client_addr.sin_addr)); _fd=_sockfd_cli;}int Socket::Send(Octets data, UInt length){ int sendLen; const char* ptr; ptr=(char*)data; while(length > 0) { sendLen=send(_fd, ptr, length, 0); if(sendLen < 0) { Logger::debug("In send error: %s", strerror(errno)); SockEnd(); exit(1); } length-=sendLen; ptr+=sendLen; } return ptr-(char*)data;}UInt Socket::Receive(Octets data){ int recvLen; UInt totalLength, nTotalLength, length; char* ptr; ptr=(char*)data; //totalLength recvLen=recv(_fd, ptr, 12, 0); if(recvLen < 0) { Logger::debug("In recv error: %s", strerror(errno)); SockEnd(); exit(1); } else if(recvLen == 0) { Logger::debug("In recv error: Connection Refused!"); SockEnd(); exit(1); } else if(recvLen < 12) { Logger::log(L_ERR, "Receive length = %d < 12 !", recvLen); SockEnd(); exit(1); } memcpy(&nTotalLength,ptr, 4); totalLength=ntohl(nTotalLength); if(totalLength < 12) { Logger::log(L_ERR, "TotalLength length < 12 !"); SockEnd(); exit(1); } length=totalLength-12; ptr+=12; while(length > 0) { recvLen=recv(_fd, ptr, length, 0); if(recvLen < 0) { Logger::debug("In recv error: %s", strerror(errno)); SockEnd(); exit(1); } else if(recvLen == 0) //client unlink break; length-=recvLen; ptr+=recvLen; } if(length != 0) { Logger::debug("Receive data length not equal total length!"); SockEnd(); exit(1); } return totalLength;}bool Socket::IsLinked(){ if(_fd <= 0) return false; else return true; }void Socket::Close(){ if(_fd > 0) close(_fd);}void Socket::SockEnd(){ if(_sockfd > 0) close(_sockfd); if(_sockfd_cli > 0) close(_sockfd_cli); if(_fd > 0) close(_fd); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -