封装类.h文件: #include <WinSock2.h> #include <Windows.h> #define MSG_MAX_LEN (1024 * 1024) class KServerSocket { public: BOOL InitSocket(); BOOL ListenMsg(UINT uPort, UINT uConnMax); BOOL AcceptMsg(OUT SOCKET& clientSock); BOOL SetTimeOut(UINT uTimeOut); BOOL RecvMsg(SOCKET clientSock, OUT LPSTR pszMsg); BOOL SendMsg(SOCKET clientSock, IN LPCSTR pszMsg); BOOL CloseSocket(); private: SOCKET m_srvSocket; }; class KClientSocket { public: BOOL InitSocket(); BOOL ConnectServer(LPCSTR pszSrvAdds, UINT uPort); BOOL SetTimeOut(UINT uTimeOut); BOOL RecvMsg(OUT LPSTR pszMsg); BOOL SendMsg(LPCSTR pszMsg); BOOL CloseSocket(); private: SOCKET m_clientSocket; }; 封装类.cpp文件: #include "ksocket.h" // // KServerSocket BOOL KServerSocket::InitSocket() { WORD wVersion = MAKEWORD(1, 1); WSADATA wsaDate; int err = WSAStartup(wVersion, &wsaDate); if (err != 0) return FALSE; if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1) { WSACleanup(); return FALSE; } m_srvSocket = socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET==m_srvSocket) return FALSE; return TRUE; } BOOL KServerSocket::ListenMsg(UINT uPort, UINT uConnMax) { SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(uPort); addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); int nRes = 0; nRes = bind(m_srvSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); if (nRes != 0) return FALSE; nRes = listen(m_srvSocket, uConnMax); if (nRes != 0) return FALSE; return TRUE; } BOOL KServerSocket::AcceptMsg(OUT SOCKET& clientSock) { SOCKADDR_IN addsClient; int nAddrLen = sizeof(SOCKADDR); SOCKET sockClient = accept(m_srvSocket, (SOCKADDR*)&addsClient, &nAddrLen); if (sockClient == SOCKET_ERROR) { clientSock = NULL; return FALSE; } else { clientSock = sockClient; return TRUE; } } BOOL KServerSocket::SetTimeOut(UINT uTimeOut) { //设置发送超时 if (SOCKET_ERROR == setsockopt(m_srvSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&uTimeOut, sizeof(UINT))) return FALSE; //设置接收超时 if (SOCKET_ERROR == setsockopt(m_srvSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&uTimeOut, sizeof(UINT))) return FALSE; return TRUE; } BOOL KServerSocket::RecvMsg(SOCKET clientSock, OUT LPSTR pszMsg) { // 获取长度 CHAR szLen[5] = {0}; int nRes = recv(clientSock, szLen, sizeof(INT), 0); if (nRes <= 0) return FALSE; // 获取长度 INT nLen = *(INT*)szLen; if (nLen >= MSG_MAX_LEN) return FALSE; // 读取信息 nRes = recv(clientSock, pszMsg, nLen, 0); pszMsg[nLen] = '/0'; if (nRes > 0) return TRUE; else return FALSE; } BOOL KServerSocket::SendMsg(SOCKET clientSock, IN LPCSTR pszMsg) { // 当pszMsg为NULL,或者为空串时,返回FALSE if (pszMsg == NULL || strlen(pszMsg) == 0 || clientSock == NULL) return FALSE; // 计算缓冲区长度 int nLen = strlen(pszMsg); int nBufLen = nLen + sizeof(INT); // 创建并填充缓冲区 CHAR* pszBuf = new CHAR[nBufLen]; CHAR* pszHead = (CHAR*)&nLen; strncpy(pszBuf, pszHead, sizeof(INT)); strncpy(pszBuf + sizeof(INT), pszMsg, nLen); // send数据 int nRes = send(clientSock, pszBuf, nBufLen, 0); if (nRes == SOCKET_ERROR) return FALSE; else return TRUE; } BOOL KServerSocket::CloseSocket() { int nRes = closesocket(m_srvSocket); return !nRes; } // KServerSocket // // // KClientSocket BOOL KClientSocket::InitSocket() { WORD wVersion = MAKEWORD(1, 1); WSADATA wsaDate; int err = WSAStartup(wVersion, &wsaDate); if (err != 0) return FALSE; if (LOBYTE(wsaDate.wVersion) != 1 || HIBYTE(wsaDate.wVersion) != 1) { WSACleanup(); return FALSE; } m_clientSocket = socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET==m_clientSocket) return FALSE; return TRUE; } BOOL KClientSocket::ConnectServer(LPCSTR pszSrvAdds, UINT uPort) { SOCKADDR_IN addrSrv; addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(uPort); addrSrv.sin_addr.S_un.S_addr = inet_addr(pszSrvAdds); int nRes = connect(m_clientSocket, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); return !nRes; } BOOL KClientSocket::SetTimeOut(UINT uTimeOut) { //设置发送超时 if (SOCKET_ERROR == setsockopt(m_clientSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&uTimeOut, sizeof(UINT))) return FALSE; //设置接收超时 if (SOCKET_ERROR == setsockopt(m_clientSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&uTimeOut, sizeof(UINT))) return FALSE; return TRUE; } BOOL KClientSocket::RecvMsg(OUT LPSTR pszMsg) { // 获取长度 CHAR szLen[5] = {0}; int nRes = recv(m_clientSocket, szLen, sizeof(INT), 0); if (nRes <= 0) return FALSE; // 获取长度 INT nLen = *(INT*)szLen; if (nLen >= MSG_MAX_LEN) return FALSE; // 读取信息 nRes = recv(m_clientSocket, pszMsg, nLen, 0); pszMsg[nLen] = '/0'; if (nRes > 0) return TRUE; else return FALSE; } BOOL KClientSocket::SendMsg(LPCSTR pszMsg) { // 当pszMsg为NULL,或者为空串时,返回FALSE if (pszMsg == NULL || strlen(pszMsg) == 0) return FALSE; // 计算缓冲区长度 int nLen = strlen(pszMsg); int nBufLen = nLen + sizeof(INT); // 创建并填充缓冲区 CHAR* pszBuf = new CHAR[nBufLen]; CHAR* pszHead = (CHAR*)&nLen; strncpy(pszBuf, pszHead, sizeof(INT)); strncpy(pszBuf + sizeof(INT), pszMsg, nLen); // send数据 int nRes = send(m_clientSocket, pszBuf, nBufLen, 0); if (nRes == SOCKET_ERROR) return FALSE; else return TRUE; } BOOL KClientSocket::CloseSocket() { int nRes = closesocket(m_clientSocket); return !nRes; } // KClientSocket // 服务器端 代码: #include "../win_socket/ksocket.h" #include "stdio.h" CHAR g_szMsg[MSG_MAX_LEN] = {0}; int main() { KServerSocket srv; BOOL b; b = srv.InitSocket(); b = srv.ListenMsg(6000, 10); b = srv.SetTimeOut(1000); SOCKET sock; while (1) { b = srv.AcceptMsg(sock); while (srv.RecvMsg(sock, g_szMsg)) { printf("%s/n", g_szMsg); } b = srv.SendMsg(sock, "123"); b = srv.SendMsg(sock, "456"); closesocket(sock); } b = srv.CloseSocket(); return 0; } 客户端 代码: #include "ksocket.h" #include "stdio.h" CHAR g_szBuf[MSG_MAX_LEN] = {0}; int main() { KClientSocket s; BOOL b; b = s.InitSocket(); b =s.ConnectServer("127.0.0.1", 6000); b = s.SetTimeOut(3000); b = s.SendMsg("123456789"); b = s.SendMsg("11111"); s.RecvMsg(g_szBuf); printf("%s/n", g_szBuf); s.RecvMsg(g_szBuf); printf("%s/n", g_szBuf); s.CloseSocket(); return 0; }