1、SocketUtil.h
// Socket函数头文件 // add by jzh 2011-04-06 #ifndef SocketUtil #define SocketUtil #include <windows.h> // 创建连接,被用于CreateServerSocket、ConnectServer的初始化。 BOOL CreateSocket(DWORD dwReadTimeOut, DWORD dwSendTimeOut, DWORD &dwSocketHandle); // 关闭连接 void CloseSocket(DWORD &dwSocketHandle); // 创建服务端监听 BOOL CreateServerSocket(DWORD dwPortNumber, DWORD dwReadTimeOut, DWORD dwSendTimeOut, DWORD &dwSocketHandle); // 接收客户端 BOOL AcceptClient(DWORD dwServerSocket, DWORD &dwClientSocket, LPSTR pszClientIP, DWORD dwSize); // 连接服务端 BOOL ConnectServer(LPCSTR pszServerIP, DWORD dwPortNumber, DWORD dwReadTimeOut, DWORD dwSendTimeOut, DWORD &dwClientSocket); // 接收数据 BOOL SocketRead(DWORD dwSocket, BYTE *pBuffer, DWORD &dwSize); // 发送数据 BOOL SocketWrite(DWORD dwSocket, const BYTE *pBuffer, DWORD dwSize); #endif
2、SocketUtil.cpp
// Socket函数实现文件 // add by jzh 2011-04-06 #include "stdafx.h" #include "SocketUtil.h" #include <Winsock2.h> #pragma comment(lib, "Ws2_32.lib") // 创建连接 BOOL CreateSocket(DWORD dwReadTimeOut, DWORD dwSendTimeOut, DWORD &dwSocketHandle) { BOOL bRetval = TRUE; static BOOL WSA_Initialized = FALSE; if (FALSE == WSA_Initialized) { WSADATA wsaData; WORD wVersionRequested = MAKEWORD( 2, 2 ); // 初始化 if(0 != WSAStartup(wVersionRequested, &wsaData)) { bRetval = FALSE; } else { WSA_Initialized = TRUE; } } int iSocket = -1; // if((iSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==INVALID_SOCKET) { bRetval = FALSE; } else { dwSocketHandle = iSocket; // 接收时限 setsockopt(iSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)(&dwReadTimeOut), sizeof(dwReadTimeOut)); // 发送时限 setsockopt(iSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&dwSendTimeOut, sizeof(dwSendTimeOut)); } return bRetval; } // 关闭连接 void CloseSocket(DWORD &dwSocketHandle) { if (INVALID_SOCKET != dwSocketHandle) { closesocket(dwSocketHandle); } } // 创建服务端监听 BOOL CreateServerSocket(DWORD dwPortNumber, DWORD dwReadTimeOut, DWORD dwSendTimeOut,DWORD &dwSocketHandle) { BOOL bRetval = TRUE; dwSocketHandle = 0; bRetval = CreateSocket(dwReadTimeOut, dwSendTimeOut, dwSocketHandle); if (TRUE == bRetval) { sockaddr_in server_addr; memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(dwPortNumber); if(bind(dwSocketHandle, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr))==-1) { bRetval = FALSE; } } if (TRUE == bRetval) //Set no blocking { unsigned long ulType = 1; if (0 != ioctlsocket(dwSocketHandle, FIONBIO, &ulType)) { bRetval = FALSE; } } if (TRUE == bRetval) { if(listen(dwSocketHandle,2)==-1) { bRetval = FALSE; } } if (FALSE == bRetval) { if (0 != dwSocketHandle) { CloseSocket(dwSocketHandle); } } return bRetval; } // 接收客户端 BOOL AcceptClient(DWORD dwServerSocket, DWORD &dwClientSocket, LPSTR pszClientIP, DWORD dwSize) { BOOL bRetval = TRUE; struct sockaddr_in client_addr; int iSocket = INVALID_SOCKET; int iSInSize; //sockaddr_in iSInSize = sizeof(struct sockaddr_in); if((iSocket = accept(dwServerSocket, (struct sockaddr *)(&client_addr), (int FAR*)(&iSInSize)))<=0) { bRetval = FALSE; } else { dwClientSocket = iSocket; char *pszIP = inet_ntoa(client_addr.sin_addr); int iLen = strlen(pszIP); if (iLen > dwSize -1) { iLen = dwSize -1; } memset(pszClientIP, 0, dwSize); strncpy(pszClientIP, pszIP, iLen); } return bRetval; } // 连接服务端 BOOL ConnectServer(LPCSTR pszServerIP, DWORD dwPortNumber, DWORD dwReadTimeOut, DWORD dwSendTimeOut, DWORD &dwClientSocket) { BOOL bRetval = TRUE; bRetval = CreateSocket(dwReadTimeOut, dwSendTimeOut, dwClientSocket); if (TRUE == bRetval) { SOCKET sock = dwClientSocket; struct sockaddr_in tagAddr; memset(&tagAddr, 0, sizeof(tagAddr)); tagAddr.sin_addr.s_addr = inet_addr(pszServerIP); tagAddr.sin_family = AF_INET; tagAddr.sin_port = htons(dwPortNumber); if(connect(sock, (struct sockaddr *)&tagAddr, sizeof(tagAddr))==0) { // } else { CloseSocket(dwClientSocket); bRetval = FALSE; } } return bRetval; } // 接收数据 BOOL SocketRead(DWORD dwSocket, BYTE *pBuffer, DWORD &dwSize) { BOOL bRetval = TRUE; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; fd_set r; FD_ZERO(&r); FD_SET(dwSocket, &r); DWORD dwBuffSize = dwSize; dwSize = 0; int iRet = select(dwSocket + 1, &r, NULL, NULL, &tv); if (iRet > 0) { iRet = recv(dwSocket, (char *)pBuffer, dwBuffSize, 0); if(iRet > 0 ) { dwSize = iRet; } else { bRetval = FALSE; } } else if (iRet < 0) //Socket broken { bRetval = FALSE; } return bRetval; } // 发送数据 BOOL SocketWrite(DWORD dwSocket, const BYTE *pBuffer, DWORD dwSize) { BOOL bRetval = TRUE; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; fd_set r; FD_ZERO(&r); FD_SET(dwSocket, &r); int iRet = select(dwSocket + 1, NULL, &r, NULL, &tv); if (iRet > 0) { if(send(dwSocket, (char*)pBuffer, dwSize, 0) ==-1 ) { bRetval = FALSE; } } else { bRetval = FALSE; } return bRetval; }