SOCKET connectSock(const char *host, const char *service , const char *transType) { SOCKET s; struct sockaddr_in sockAddr; int type,protocol; struct hostent *phe; struct servent *pse; memset(&sockAddr,0,sizeof(sockAddr)); sockAddr.sin_family = AF_INET; if (pse = getservbyname(service,transType)) //如果service输入是服务名称 { sockAddr.sin_port = pse->s_port; } else if( (sockAddr.sin_port = htons((u_short)atoi(service)) )== 0) //如果service输入是端口号 { fprintf(stderr,"Can't get \"%s\" port number or service entry\n", service); return INVALID_SOCKET; } if (phe = gethostbyname(host)) //如果host输入是域名 { memcpy(&sockAddr.sin_addr , phe->h_addr, phe->h_length); } else if ( (sockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) //host是IP地址 { fprintf(stderr,"Can't get \"%s\" IP address or host entry \n", host); return INVALID_SOCKET; } if (strcmp(transType, "udp") == 0) { type = SOCK_DGRAM; protocol = IPPROTO_UDP; } else { type = SOCK_STREAM; protocol = IPPROTO_TCP; } if ( (s = socket(AF_INET , type ,protocol)) == INVALID_SOCKET) //初始化s { sockError("Can't create socket!"); return INVALID_SOCKET; } if (connect(s, (struct sockaddr *)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR) { fprintf(stderr,"Can't connect to %s.%s:\n", host, service); sockError(""); return INVALID_SOCKET; } return s; }
SOCKET passiveSock(const char *service , const char *transType , int qlen) //建立被动套接字 { SOCKET s; struct sockaddr_in sockAddr; int type,protocol; struct servent *pse; memset(&sockAddr,0 ,sizeof(sockAddr)); sockAddr.sin_family = AF_INET; sockAddr.sin_addr.s_addr = INADDR_ANY; if ( pse =getservbyname(service ,transType)) //如果是服务名称 { sockAddr.sin_port = pse->s_port ; } else if ( (sockAddr.sin_port = htons((u_short)atoi(service))) ==0) { fprintf(stderr,"Can't get \"%s\" port number or service entry\n", service); return INVALID_SOCKET; } if (strcmp(transType, "udp") == 0) { type = SOCK_DGRAM; protocol = IPPROTO_UDP; } else { type = SOCK_STREAM; protocol = IPPROTO_TCP; } if ((s = socket(AF_INET,type,protocol)) == INVALID_SOCKET) //初始化 { sockError("Can't create socket!"); return INVALID_SOCKET; } if (bind(s,(struct sockaddr *)&sockAddr,sizeof(sockAddr)) == SOCKET_ERROR) //绑定 { fprintf(stderr,"Can't bind to port: %d \n", service); sockError(""); return INVALID_SOCKET; } if (type == SOCK_STREAM && listen(s,qlen) == SOCKET_ERROR) //如果是TCP监听 { fprintf(stderr,"Can't listen to port: %d \n", service); sockError(""); return INVALID_SOCKET; } return s; }
long pnSocket::peek(void* buffer, size_t size) { long count = ::recv(fSockHandle, (sockbuf_t)buffer, size, MSG_PEEK); if (count == -1 && sockError() != ECONNRESET) plDebug::Error("Peek failed: {}", getSockErrorStr()); return count; }
bool Socket::readChunk() { dataBegin = dataEnd = 0; int r = recv(s, staticBuffer, 1024, 0); if(r != -1) { if(r == 0) { connected = false; return true; // No more data } dataBegin = staticBuffer; dataEnd = staticBuffer + r; resetTimer(); } else if(sockError() != EWOULDBLOCK) { error = ErrorRecv; return true; // Error } else { checkTimeout(); } return error != ErrorNone; }
bool Socket::trySend(char const*& b, char const* e) { assert(b <= e); if(b == e) return true; int sent = ::send(s, b, e - b, 0); if(sent == -1) { if(sockError() != EWOULDBLOCK) // Error { error = ErrorSend; return true; } else checkTimeout(); } else { b += sent; if(b == e) return true; } return error != ErrorNone; }
long pnSocket::recv(void* buffer, size_t size) { long count = ::recv(fSockHandle, (sockbuf_t)buffer, size, 0); if (count == -1 && sockError() != ECONNRESET) { plDebug::Error("Recv failed: {}", getSockErrorStr()); close(); } return count; }