1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <Winsock2.h> #pragma comment(lib, "Ws2_32.lib")
void initialization() { WORD w_req = MAKEWORD(2, 2); WSADATA wsadata; int err; err = WSAStartup(w_req, &wsadata); if (err != 0) { cout << "初始化套接字库失败!" << endl; } else { cout << "初始化套接字库成功!" << endl; } if (LOBYTE(wsadata.wVersion) != 2 HIBYTE(wsadata.wHighVersion) != 2) { cout << "套接字库版本号不符!" << endl; WSACleanup(); } else { cout << "套接字库版本正确!" << endl; } }
DWORD WINAPI ThreadProc(LPVOID lpParameter) { SOCKET sClient = (SOCKET)lpParameter;
while (true) { PACKAGE pkgForm; int nRet = recv(sClient, (char*)&pkgForm, sizeof(PACKAGE), 0); if (nRet == 0 nRet == SOCKET_ERROR) { if (WSAGetLastError() == WSAECONNRESET) { printf("远程主机强迫关闭了一个现有的连接\r\n"); closesocket(sClient); return 0; } else { continue; } }
Sleep(1); }
return 0; }
int main() { initialization(); SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockServer == INVALID_SOCKET) { cout << "socket 创建失败 \r\n" << endl; return 0; } sockaddr_in siServer; siServer.sin_family = AF_INET; siServer.sin_port = htons(0x9527); siServer.sin_addr.S_un.S_addr = inet_addr("0.0.0.0"); int nRet = bind(sockServer, (sockaddr*)&siServer, sizeof(siServer)); if (nRet == SOCKET_ERROR) { cout << "绑定地址失败 \r\n" << endl; return 0; } else { cout << "服务器启动完毕 \r\n" << endl; } if (listen(sockServer, SOMAXCONN) == SOCKET_ERROR) { cout << "端口监听失败 \r\n" << endl; } cout << "服务端正在监听连接,请稍候...." << endl; while (true) { sockaddr_in siAccept; int nLen = sizeof(SOCKADDR_IN); SOCKET sClient = ::accept(sockServer, (SOCKADDR*)&siAccept, &nLen); if (sClient == SOCKET_ERROR) { cout << "连接失败!" << endl; WSACleanup(); return 0; } cout << "连接建立[" << inet_ntoa(siAccept.sin_addr) << ":" << ntohs(siAccept.sin_port) << "],准备接受数据" << endl; HANDLE hThread = CreateThread(NULL, 0, ThreadProc, (PVOID)sClient, 0, NULL); if (hThread == NULL) { cout << "工作线程建立失败" << endl; closesocket(sClient); continue; } else { cout << "工作线程建立成功" << endl; } CloseHandle(hThread); Sleep(1); }
closesocket(sockServer); WSACleanup(); }
|