1. 程式人生 > 其它 >C++ Win32 sokcet2.0版本 TCP 伺服器

C++ Win32 sokcet2.0版本 TCP 伺服器

 1 #include<winsock2.h>//winsock的標頭檔案
 2 #include<iostream>
 3 using  namespace  std;
 4 
 5 //指定動態庫的lib檔案
 6 #pragma comment(lib,"ws2_32.lib")
 7 
 8 //TCP服務端
 9 int main()
10 {
11 
12     //初始化winsock2.2相關的動態庫
13     WSADATA  wd;//獲取socket相關資訊
14     if (WSAStartup(MAKEWORD(2, 2), &wd) != 0)//0表示成功
15 { 16 cout << "WSAStartup error:"<< WSAGetLastError() << endl; 17 return 0; 18 } 19 20 //1.建立TCP socket , 流式套接字 21 SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 22 if (s == INVALID_SOCKET) 23 { 24 cout << "socket error:
" << WSAGetLastError() << endl; 25 return 0; 26 } 27 28 //2.繫結socket到一個IP地址和埠 29 sockaddr_in addr;//不建議使用sockaddr,建議用sockaddr_in 30 addr.sin_port = htons(8000);//網路位元組序 31 addr.sin_addr.S_un.S_addr =inet_addr( "127.0.0.1" );//網路位元組序 32 addr.sin_family = AF_INET; //地址族 33
int len = sizeof(sockaddr_in); 34 if (bind(s, (sockaddr *)&addr, len) == SOCKET_ERROR) 35 { 36 cout << "bind error:" << WSAGetLastError() << endl; 37 return 0; 38 } 39 40 //3.監聽, 5代表正在等待完成相應的TCP三路握手過程的佇列長度 41 if(listen(s, 5) == SOCKET_ERROR) 42 { 43 cout << "listen error:" << WSAGetLastError() << endl; 44 return 0; 45 } 46 47 48 //4.接受客戶端請求,並且返回和客戶端通訊的套接字 49 sockaddr_in addrClient;// 儲存客戶端IP地址埠 50 memset(&addrClient, 0, sizeof(sockaddr_in)); 51 len = sizeof(sockaddr_in); 52 SOCKET c= accept(s, (sockaddr*)&addrClient, &len);//成功返回套接字 53 if (c == INVALID_SOCKET) 54 { 55 cout << "accept error:" << WSAGetLastError() << endl; 56 return 0; 57 } 58 59 60 //5.傳送,接受訊息 61 int ret = 0; 62 do 63 { 64 //向客戶端傳送資料,不能用監聽套接字s,而應該用accept返回的套接字c 65 ret = send(c, "I am Server!", strlen("I am Server!"), 0);//把flag置0 66 67 //接受客戶端的訊息 68 char buf[64] = {'\0'}; 69 ret = recv(c, buf, 64, 0);//把flag置0 70 cout << "recv" << inet_ntoa ( addrClient.sin_addr )<<": "<< buf << endl;// inet_ntoa轉換為IP字串 71 } while (ret != SOCKET_ERROR && ret != 0);//對方關閉,返回0 ,錯誤返回SOCKET_ERROR 72 73 74 //6.關閉套接字 75 closesocket(s); 76 77 78 //清理winsock環境 79 WSACleanup(); 80 81 82 return 0; 83 }