WinSocket實現程序通訊的一個簡單例項
阿新 • • 發佈:2019-02-02
/* ServerNet.cpp */ #include"ServerNet.h" /*伺服器初始化*/ int ServerNet::ServerInit(const char* address, int port) { int rlt = 0; int iErrorMsg; //初始化WinSock WSAData wsaData; iErrorMsg = WSAStartup(MAKEWORD(1, 1), &wsaData); if (iErrorMsg != NO_ERROR) { //初始化WinSock失敗 printf("server wsastartup failed with error : %d\n", iErrorMsg); rlt = 1; return rlt; } // 建立伺服器端socket m_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_sock == INVALID_SOCKET) // 建立socket出現了異常 { printf("server socket failed with error: %d\n", WSAGetLastError()); rlt = 2; return rlt; } // 宣告資訊 SOCKADDR_IN servaddr; servaddr.sin_family = AF_INET; servaddr.sin_port = port; servaddr.sin_addr.s_addr = inet_addr(address); //繫結 iErrorMsg = bind(m_sock, (SOCKADDR*)&servaddr, sizeof(servaddr)); if (iErrorMsg < 0) { //繫結失敗 printf("bind failed with error : %d\n", iErrorMsg); rlt = 3; return rlt; } return rlt; } void ServerNet::ServerRun() { // 公開連線 listen(m_sock, 5); SOCKADDR_IN tcpAddr; int len = sizeof(sockaddr); SOCKET newSocket; char buf[1024]; int rval; do { // 接收資訊 newSocket = accept(m_sock, (sockaddr*)&tcpAddr, &len); if (newSocket == INVALID_SOCKET) { // 非可用socket printf("invalid socket occured.\n"); } else { // 可用的新socket連線 printf("new socket connect: %d\n", newSocket); // 訊息處理 do { //printf("process\n"); // 接收資料 memset(buf, 0, sizeof(buf)); rval = recv(newSocket, buf, 1024, 0); if (rval == SOCKET_ERROR) // 該異常通常發生在未closeSocket就退出時 { printf("recv socket error.\n"); break; } else if (rval == 0) // 0表示正常退出 printf("socket %d connect end.\n", newSocket); else // 顯示接收到的資料 printf("recv msg: %s\n", buf); } while (rval != 0); // 關於接收的socket closesocket(newSocket); } } while (1); // 關閉自身socket closesocket(m_sock); }