Win Socket 学习 (Tcp和Udp)

主要是winSock的函数的使用,代码只是示例如何使用,没有什么很特别的地方。同步winSock编程比较简单,高级部分需要看异步socket编程。

Tcp示例代码功能:服务器端启动并等待客户端信息,收到信息处理并显示,然后将信息回送给客户端,客户端再显示。

TcpServer

TcpServer
  1 #include <winsock2.h>
2 #include <iostream>
3 #pragma comment(lib, "ws2_32.lib")
4
5 using namespace std;
6
7 #define BUFSIZE 64
8 #define PORT 9999
9 int main()
10 {
11 WSADATA wsadata;
12 SOCKET sServer;
13 SOCKET sClient;
14 int retVal;
15 char buf[BUFSIZE];
16
17 if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
18 {
19 cout << "WSAStartup失败!" << endl;
20 return -1;
21 }
22
23 sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); /* ******************** 1 **************** */
24 if (INVALID_SOCKET == sServer)
25 {
26 cout << "socket() 错误!" << endl;
27 WSACleanup();
28 return -1;
29 }
30
31 SOCKADDR_IN addrServ;
32 addrServ.sin_family = AF_INET;
33 addrServ.sin_port = htons(PORT);
34 addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
35 retVal = bind(sServer, (const struct sockaddr*)&addrServ, sizeof(addrServ)); /* ******************** 2 **************** */
36 if (SOCKET_ERROR == retVal)
37 {
38 cout << "bind 错误!" << endl;
39 closesocket(sServer);
40 WSACleanup();
41 return -1;
42 }
43
44 retVal = listen(sServer,10); /* ******************** 3 **************** */
45 if (SOCKET_ERROR == retVal)
46 {
47 cout << "listen 错误!" << endl;
48 closesocket(sServer);
49 WSACleanup();
50 return -1;
51 }
52
53 cout << "TCP服务器开始监听" << PORT << "端口" << endl;
54 SOCKADDR_IN addrClient;
55 int addrClientLen = sizeof(addrClient);
56 sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientLen); /* ******************** 4 **************** */
57 if (INVALID_SOCKET == sClient)
58 {
59 cout << "accept() 错误!" << endl;
60 WSACleanup();
61 return -1;
62 }
63
64 while (true)
65 {
66 ZeroMemory(buf, BUFSIZE);
67 retVal = recv(sClient, buf, BUFSIZE, 0); /* ******************** 5 **************** */
68 if (SOCKET_ERROR == retVal)
69 {
70 cout << "recv()错误!" << endl;
71 closesocket(sServer);
72 closesocket(sClient);
73 WSACleanup();
74 return -1;
75 }
76
77 SYSTEMTIME time;
78 GetLocalTime(&time);
79 char datetime[30];
80 sprintf(datetime,"%4d-%2d-%2d %2d:%2d:%2d",time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
81 cout << datetime << "" << inet_ntoa(addrClient.sin_addr) << ":" << addrClient.sin_port << "接受了如下内容: " << buf << endl;
82
83 if (strcmp(buf, "quit") == 0)
84 {
85 retVal = send(sClient, "quit", strlen("quit"), 0);
86 break;
87 }
88 else
89 {
90 retVal = send(sClient, buf, strlen(buf), 0); /* ******************** 6 **************** */
91 if (SOCKET_ERROR == retVal)
92 {
93 cout << "send错误!" << endl;
94 closesocket(sServer);
95 closesocket(sClient);
96 WSACleanup();
97 return -1;
98 }
99 }
100 }
101
102 closesocket(sServer);
103 closesocket(sClient);
104 WSACleanup();
105
106 return 0;
107 }

 

TcpClient

TcpClient
 1 #include <Winsock.h>
2 #include <string>
3 #include <iostream>
4
5 #pragma comment(lib, "ws2_32.lib")
6 using namespace std;
7
8
9 #define BUFSIZE 64
10 #define PORT 9999
11
12 int main()
13 {
14 WSAData wsaData;
15 SOCKET sHost;
16 sockaddr_in addrServ;
17 char buf[BUFSIZE];
18 int retVal;
19
20 if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
21 {
22 cout << "WSAStartup失败!" << endl;
23 return -1;
24 }
25
26 sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
27 if (INVALID_SOCKET == sHost)
28 {
29 cout << "socket() 错误!" << endl;
30 WSACleanup();
31 return -1;
32 }
33
34 addrServ.sin_family = AF_INET;
35 addrServ.sin_port = htons(PORT);
36 addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
37
38 retVal = connect(sHost, (LPSOCKADDR)&addrServ, sizeof(addrServ));
39 if (SOCKET_ERROR == retVal)
40 {
41 cout << "connect 错误!" << endl;
42 closesocket(sHost);
43 WSACleanup();
44 return -1;
45 }
46
47 while (true)
48 {
49 cout << "输入要发给服务器的内容" << endl;
50 // string msg;
51 // getline(cin, msg);
52 char msg[BUFSIZE];
53 cin.getline(msg, BUFSIZE);
54 ZeroMemory(buf, BUFSIZE);
55 strcpy(buf, msg);
56 retVal = send(sHost, buf, strlen(buf), 0);
57 if (SOCKET_ERROR == retVal)
58 {
59 cout << "发送失败" << endl;
60 closesocket(sHost);
61 WSACleanup();
62 return -1;
63 }
64
65 retVal = recv(sHost, buf, sizeof(buf)+1, 0);
66 cout << "从服务器端接收:" << buf << endl;
67 if (strcmp(buf, "quit") == 0)
68 {
69 cout << "quit" << endl;
70 break;
71 }
72 }
73
74 closesocket(sHost);
75 WSACleanup();
76
77
78 return 0;
79 }

 

 

Udp示例代码功能:服务器端启动并等待客户端信息,收到信息处理并显示,然后将信息回送给客户端,客户端再显示。

UdpServer

UdpServer
 1 #include <winsock2.h>
2 #include <iostream>
3 #pragma comment(lib, "ws2_32.lib")
4
5 using namespace std;
6
7 #define BUFSIZE 1024
8 #define PORT 9999
9 int main()
10 {
11 WSADATA wsadata;
12 SOCKET sServer;
13 sockaddr_in addrClient, addrServer;
14 int addrClientLen = sizeof(addrClient);
15 char buf[BUFSIZE];
16
17 if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
18 {
19 cout << "WSAStartup失败!" << endl;
20 return -1;
21 }
22
23 sServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
24 addrServer.sin_family = AF_INET;
25 addrServer.sin_port = htons(PORT);
26 addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
27 bind(sServer, (SOCKADDR*) &addrServer, sizeof(addrServer));
28 cout << "从客户端接收:" << endl;
29 recvfrom(sServer, buf, BUFSIZE, 0, (SOCKADDR *)&addrClient, &addrClientLen);
30
31 sendto(sServer, buf, BUFSIZE, 0, (SOCKADDR *)&addrClient, sizeof(addrClient));
32
33
34
35 cout << "完成接收:" << buf << endl;
36
37 closesocket(sServer);
38
39
40
41 WSACleanup();
42
43 return 0;
44 }

 

UdpClient

UdpClient
 1 #include <winsock2.h>
2 #include <iostream>
3 #include <string>
4 #pragma comment(lib, "ws2_32.lib")
5
6 using namespace std;
7
8 #define BUFSIZE 1024
9 #define PORT 9999
10 int main()
11 {
12 WSADATA wsadata;
13 SOCKET sClient;
14 sockaddr_in addrServer;
15 int addrServerLen = sizeof(addrServer);
16 char buf[BUFSIZE];
17
18 if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
19 {
20 cout << "WSAStartup失败!" << endl;
21 return -1;
22 }
23
24 sClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
25 addrServer.sin_family = AF_INET;
26 addrServer.sin_port = htons(PORT);
27 addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
28
29 cout << "请输入要发送给服务器的内容:" << endl;
30 cin.getline(buf, BUFSIZE);
31 sendto(sClient, buf, BUFSIZE, 0, (SOCKADDR *)&addrServer, addrServerLen);
32 memset(buf, 0, BUFSIZE);
33
34 recvfrom(sClient, buf, BUFSIZE, 0, (SOCKADDR *)&addrServer, &addrServerLen);
35 cout << buf << endl;
36
37
38 closesocket(sClient);
39
40
41
42 WSACleanup();
43
44 return 0;
45 }

 

转载于:https://www.cnblogs.com/hanyuanbo/archive/2012/03/31/2426505.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值