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}