Windows Socket執行個體

來源:互聯網
上載者:User

Windows下Socket編程主要包括以下幾部分:
服務端
   1、初始化Windows Socket庫。
   2、建立Socket。
   3、綁定Socket。
   4、監聽。
   5、Accept。
   6、接收、發送資料。
用戶端
   1、初始化Windows Socket庫。
   2、建立Socket。
   3、串連Socket。
   4、接收、發送資料。
服務端每接收到一個用戶端的Socket,則建立一個線程。滿足一個服務端串連多個用戶端。

  1 //Server.cpp
  2 #include <iostream>
  3 #include <Windows.h>
  4
  5 using namespace std;
  6
  7 #define  PORT 4000
  8 #define  IP_ADDRESS "192.168.1.145"
  9
10 DWORD WINAPI ClientThread(LPVOID lpParameter)
11 {
12     SOCKET CientSocket = (SOCKET)lpParameter;
13 int Ret = 0;
14 char RecvBuffer[MAX_PATH];
15
16 while ( true )
17     {
18         memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
19         Ret = recv(CientSocket, RecvBuffer, MAX_PATH, 0);
20 if ( Ret == 0 || Ret == SOCKET_ERROR )
21         {
22             cout<<"用戶端退出!"<<endl;
23 break;
24         }
25         cout<<"接收到客戶資訊為:"<<RecvBuffer<<endl;
26     }
27
28 return 0;
29 }
30
31 int main(int argc, char* argv[])
32 {
33     WSADATA  Ws;
34     SOCKET ServerSocket, CientSocket;
35 struct sockaddr_in LocalAddr, ClientAddr;
36 int Ret = 0;
37 int AddrLen = 0;
38     HANDLE hThread = NULL;
39
40 //Init Windows Socket
41 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
42     {
43         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
44 return -1;
45     }
46
47 //Create Socket
48     ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
49 if ( ServerSocket == INVALID_SOCKET )
50     {
51         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
52 return -1;
53     }
54
55     LocalAddr.sin_family = AF_INET;
56     LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
57     LocalAddr.sin_port = htons(PORT);
58     memset(LocalAddr.sin_zero, 0x00, 8);
59
60 //Bind Socket
61     Ret = bind(ServerSocket, (struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
62 if ( Ret != 0 )
63     {
64         cout<<"Bind Socket Failed::"<<GetLastError()<<endl;
65 return -1;
66     }
67
68     Ret = listen(ServerSocket, 10);
69 if ( Ret != 0 )
70     {
71         cout<<"listen Socket Failed::"<<GetLastError()<<endl;
72 return -1;
73     }
74
75     cout<<"服務端已經啟動"<<endl;
76
77 while ( true )
78     {
79         AddrLen = sizeof(ClientAddr);
80         CientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
81 if ( CientSocket == INVALID_SOCKET )
82         {
83             cout<<"Accept Failed::"<<GetLastError()<<endl;
84 break;
85         }
86
87         cout<<"用戶端串連::"<<inet_ntoa(ClientAddr.sin_addr)<<":"<<ClientAddr.sin_port<<endl;
88
89         hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)CientSocket, 0, NULL);
90 if ( hThread == NULL )
91         {
92             cout<<"Create Thread Failed!"<<endl;
93 break;
94         }
95
96         CloseHandle(hThread);
97     }
98
99     closesocket(ServerSocket);
100     closesocket(CientSocket);
101     WSACleanup();
102
103 return 0;
104 }

1 //Client.cpp
2 #include <iostream>
3 #include <Windows.h>
4
5 using namespace std;
6
7 #define  PORT 4000
8 #define  IP_ADDRESS "192.168.1.145"
9
10
11 int main(int argc, char* argv[])
12 {
13     WSADATA  Ws;
14     SOCKET CientSocket;
15 struct sockaddr_in ServerAddr;
16 int Ret = 0;
17 int AddrLen = 0;
18     HANDLE hThread = NULL;
19 char SendBuffer[MAX_PATH];
20
21 //Init Windows Socket
22 if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
23     {
24         cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
25 return -1;
26     }
27
28 //Create Socket
29     CientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
30 if ( CientSocket == INVALID_SOCKET )
31     {
32         cout<<"Create Socket Failed::"<<GetLastError()<<endl;
33 return -1;
34     }
35
36     ServerAddr.sin_family = AF_INET;
37     ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
38     ServerAddr.sin_port = htons(PORT);
39     memset(ServerAddr.sin_zero, 0x00, 8);
40
41     Ret = connect(CientSocket,(struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
42 if ( Ret == SOCKET_ERROR )
43     {
44         cout<<"Connect Error::"<<GetLastError()<<endl;
45 return -1;
46     }
47 else
48     {
49         cout<<"串連成功!"<<endl;
50     }
51
52 while ( true )
53     {
54         cin.getline(SendBuffer, sizeof(SendBuffer));
55         Ret = send(CientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
56 if ( Ret == SOCKET_ERROR )
57         {
58             cout<<"Send Info Error::"<<GetLastError()<<endl;
59 break;
60         }
61     }
62
63     closesocket(CientSocket);
64     WSACleanup();
65
66 return 0;
67 }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.