1 2#include "phsocket.h" 3#include <time.h> 4 5#ifdef _WIN32 6#define socklen_t int 7#pragma comment(lib, "Ws2_32.lib") 8#else 9#define INVALID_SOCKET -1 10#define closesocket close 11#define ioctlsocket ioctl 12inline int getSocketError() 13{ 14 return errno; 15} 16 17#endif 18 19 20BOOL phAccept(int m_hSocket, int *rSocket, struct sockaddr_in *lpsockaddr_in, int* lpsockaddr_inLen) 21{ 22 int hTemp = accept(m_hSocket, (struct sockaddr *)lpsockaddr_in, (socklen_t *)lpsockaddr_inLen); 23 if(hTemp == INVALID_SOCKET) 24 { 25 return FALSE; 26 } 27 else 28 { 29 *rSocket = hTemp; 30 } 31 return TRUE; 32} 33 34 35BOOL phBind(int m_hSocket, unsigned short nSocketPort, char * lpszSocketAddress) 36{ 37 struct sockaddr_in mysockaddr_in; 38 memset(&mysockaddr_in,0,sizeof(struct sockaddr_in)); 39 40 mysockaddr_in.sin_family = AF_INET; 41 42 if(lpszSocketAddress == NULL) 43 mysockaddr_in.sin_addr.s_addr = htonl(INADDR_ANY); 44 else 45 { 46 long lResult = inet_addr(lpszSocketAddress); 47 if(lResult == INADDR_NONE) 48 { 49 //m_LastError = -1; 50 //return FALSE; 51 lResult = INADDR_ANY; 52 } 53 mysockaddr_in.sin_addr.s_addr = lResult; 54 } 55 56 mysockaddr_in.sin_port = htons((u_short)nSocketPort); 57 58 if(bind(m_hSocket, (const struct sockaddr*)&mysockaddr_in, sizeof(struct sockaddr_in)) < 0) 59 { 60 return FALSE; 61 } 62 return TRUE; 63} 64 65void phClose(int *m_hSocket) 66{ 67 if(*m_hSocket != INVALID_SOCKET) 68 { 69 closesocket(*m_hSocket); 70 *m_hSocket = INVALID_SOCKET; 71 } 72} 73 74BOOL phConnect(int m_hSocket, char * lpszHostAddress, unsigned short nHostPort, int *nAddressIndex, char *szSelectedAddress) 75{ 76 struct sockaddr_in mysockaddr_in; 77 struct hostent * lphost = NULL; 78 int index = 0; 79 int total = 0; 80 int i=0; 81 int ret = -1; 82 83 if (lpszHostAddress == NULL) return FALSE; 84 memset(&mysockaddr_in,0,sizeof(struct sockaddr_in)); 85 86 mysockaddr_in.sin_family = AF_INET; 87 mysockaddr_in.sin_addr.s_addr = inet_addr(lpszHostAddress); 88 89 if (mysockaddr_in.sin_addr.s_addr == INADDR_NONE) 90 { 91 92 lphost = gethostbyname(lpszHostAddress); 93 if (lphost != NULL) 94 { 95 while (lphost->h_addr_list[i]) {total++; i++;} 96 97 if (nAddressIndex) 98 { 99 if (*nAddressIndex==-1) 100 { 101 if (total>1) 102 { 103 index = time(0)%total; 104 *nAddressIndex = index; 105 } 106 else index = 0; 107 } 108 else 109 { 110 if (*nAddressIndex >= total) *nAddressIndex = 0; 111 index = *nAddressIndex; 112 } 113 } 114 115 mysockaddr_in.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr_list[index])->s_addr; 116 if (szSelectedAddress) 117 { 118 strcpy(szSelectedAddress,inet_ntoa(mysockaddr_in.sin_addr)); 119 //AfxMessageBox(szSelectedAddress); 120 } 121 } 122 else 123 { 124 return FALSE; 125 } 126 } 127 else 128 { 129 if (szSelectedAddress) strcpy(szSelectedAddress,inet_ntoa(mysockaddr_in.sin_addr)); 130 } 131 132 mysockaddr_in.sin_port = htons((u_short)nHostPort); 133 134 ////////////////////////////////////////////////////////////////////////// 135 136 ret = connect(m_hSocket, (const struct sockaddr*)&mysockaddr_in, sizeof(struct sockaddr_in)); 137 if(ret < 0) 138 { 139 return FALSE; 140 } 141 ////////////////////////////////////////////////////////////////////////// 142 return TRUE; 143} 144 145BOOL phrawConnect(int m_hSocket, struct sockaddr_in* psockaddr_in, int nsockaddr_inLen) 146{ 147 int nConResult; 148 if (psockaddr_in == NULL) return FALSE; 149 150 nConResult = connect(m_hSocket, (const struct sockaddr*)psockaddr_in, nsockaddr_inLen); 151 if(nConResult < 0) 152 { 153 return FALSE; 154 } 155 return TRUE; 156} 157 158BOOL phCreate(int *m_hSocket, unsigned short nSocketPort, int nSocketType, char * lpszSocketAddress) 159{ 160 if(*m_hSocket != INVALID_SOCKET) 161 { 162 return FALSE; 163 } 164 165 *m_hSocket = socket(PF_INET, nSocketType, 0); 166 if(*m_hSocket == INVALID_SOCKET) 167 { 168 return FALSE; 169 } 170 if(phBind(*m_hSocket, nSocketPort, lpszSocketAddress)) 171 return TRUE; //Normal exit 172 phClose(m_hSocket); 173 return FALSE; 174} 175 176BOOL Listen(int m_hSocket, int nConnectionBacklog/*=5*/) 177{ 178 if(listen(m_hSocket, nConnectionBacklog) != 0) //error occured 179 { 180 return FALSE; 181 } 182 return TRUE; 183} 184 185int phReceive(int m_hSocket, void* lpBuf, int nBufLen, int nFlag) 186{ 187 int nResult; 188 nResult = recv(m_hSocket, (char*)lpBuf, nBufLen, nFlag); 189 return nResult; 190} 191 192int phReceiveFrom(int m_hSocket, void* lpBuf, int nBufLen, char *rSocketAddress, unsigned short *rSocketPort, int nFlags) 193{ 194 struct sockaddr_in mysockaddr_in; 195 int nsockaddr_inLen; 196 int nResult; 197 198 memset(&mysockaddr_in, 0, sizeof(struct sockaddr_in)); 199 200 nsockaddr_inLen = sizeof(struct sockaddr_in); 201 202 nResult = recvfrom(m_hSocket, (char*)lpBuf, nBufLen, nFlags, (struct sockaddr*)&mysockaddr_in, (socklen_t *)&nsockaddr_inLen); 203 if(nResult < 0) 204 { 205 return nResult; 206 } 207 else 208 { 209 *rSocketPort = ntohs(mysockaddr_in.sin_port); 210 strcpy(rSocketAddress,inet_ntoa(mysockaddr_in.sin_addr)); 211 } 212 return nResult; 213} 214 215int phrawReceiveFrom(int m_hSocket, void* lpBuf, int nBufLen, struct sockaddr_in* psockaddr_in, int* pnsockaddr_inLen, int nFlags) 216{ 217 int nResult; 218 memset(psockaddr_in, 0, sizeof(struct sockaddr_in)); 219 220 *pnsockaddr_inLen = sizeof(struct sockaddr_in); 221 222 nResult = recvfrom(m_hSocket, (char*)lpBuf, nBufLen, nFlags, (struct sockaddr*)psockaddr_in,(socklen_t *) pnsockaddr_inLen); 223 224 return nResult; 225} 226 227int phSend(int m_hSocket, void* lpBuf, int nBufLen, int nFlag) 228{ 229 int nResult; 230 231 nResult = send(m_hSocket, (char*)lpBuf, nBufLen, nFlag); 232 return nResult; 233} 234 235int phSendTo(int m_hSocket, const void* lpBuf, int nBufLen, unsigned short nHostPort, char * lpszHostAddress, int nFlags) 236{ 237 struct sockaddr_in mysockaddr_in; 238 239 int nsockaddr_inLen = sizeof(struct sockaddr_in); 240 int nResult; 241 struct hostent * lphost = NULL; 242 243 memset(&mysockaddr_in, 0, sizeof(struct sockaddr_in)); 244 mysockaddr_in.sin_family = AF_INET; 245 246 if (lpszHostAddress == NULL) 247 mysockaddr_in.sin_addr.s_addr = htonl(INADDR_BROADCAST); 248 else 249 { 250 mysockaddr_in.sin_addr.s_addr = inet_addr(lpszHostAddress); 251 if (mysockaddr_in.sin_addr.s_addr == INADDR_NONE) 252 { 253 lphost = gethostbyname(lpszHostAddress); 254 if (lphost != NULL) 255 mysockaddr_in.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr; 256 else 257 { 258 return -1; 259 } 260 } 261 } 262 263 mysockaddr_in.sin_port = htons((u_short)nHostPort); 264 nResult = sendto(m_hSocket, (char*)lpBuf, nBufLen, nFlags, (const struct sockaddr*)&mysockaddr_in, nsockaddr_inLen); 265 return nResult; 266} 267 268int phrawSendTo(int m_hSocket, const void* lpBuf, int nBufLen, struct sockaddr_in* psockaddr_in, int nsockaddr_inLen, int nFlags) 269{ 270 int nResult; 271 nResult = sendto(m_hSocket, (char*)lpBuf, nBufLen, nFlags, (const struct sockaddr*)psockaddr_in, nsockaddr_inLen); 272 return nResult; 273} 274 275int phReadOneLine(int m_hSocket, char * lpszBuf, int nBufLen) 276{ 277 int nReadCount = 0; 278 int nRecv = 0; 279 lpszBuf[0] = '\0'; 280 281 for (; ; ) 282 { 283 if (phDataReadable(m_hSocket, 30) <= 0) return 0; 284 nRecv = recv(m_hSocket, lpszBuf + nReadCount, 1, 0); 285 //printf("recvoneline:%s,count:%d\n",lpszBuf,nRecv); 286 //if (nRecv == 0) continue; 287 if (nRecv > 0) 288 { 289 nReadCount += nRecv; 290 291 if (lpszBuf[nReadCount - 1] == '\n') 292 { 293 if (nReadCount > 1 && lpszBuf[nReadCount - 2] == '\r') 294 { 295 lpszBuf[nReadCount - 2] = '\0'; 296 } 297 else 298 { 299 lpszBuf[nReadCount - 1] = '\0'; 300 } 301 break; 302 } 303 304 if (nReadCount == nBufLen) 305 { 306 break; 307 } 308 } 309 else 310 { 311 nReadCount = -1; 312 break; 313 } 314 } 315 return nReadCount; 316} 317 318int phDataReadable(int m_hSocket, int nTimeout) 319{ 320 fd_set fdR; 321 int ret; 322 struct timeval timeout; 323 timeout.tv_sec = nTimeout; 324 timeout.tv_usec = 0; 325 326 FD_ZERO(&fdR); 327 FD_SET(m_hSocket, &fdR); 328 switch (ret = select(m_hSocket+1, &fdR, NULL,NULL, &timeout)) 329 { 330 case -1: 331 return -1; 332 break; 333 case 0: 334 return 0; 335 break; 336 default: 337 return ret; 338 break; 339 } 340} 341 342 343void phSetBlockingMode(int m_hSocket, BOOL bBlocking) 344{ 345 unsigned long on = 1; 346 if (bBlocking) on = 0; 347 if (ioctlsocket(m_hSocket, FIONBIO, &on) < 0) { 348 return; 349 } 350 return; 351}