c++下基于windows socket的服务器客户端程序(基于UDP协议)

      前天写了一个基于tcp协议的服务器客户端程序,今天写了一个基于UDP协议的,由于在上一篇使用TCP协议的服务器中注释已经较为详细,且许多api的调用是相同的,故不再另外注释。

      使用UDP协议需要注意几点:

      ①UDP是面向无连接的,客户端在于服务器通信前无须建立连接,且UDP协议不保证发出的消息是否被收到,是否有丢失。

      ②UDP的接收和发送信息使用recvfrom()与sendto()函数

      代码如下:

服务器端:

 1 #include <iostream>
 2 #include "Ws2tcpip.h"
 3 #include "Winsock2.h"
 4 
 5 using std::cin;
 6 using std::cout;
 7 using std::cerr;
 8 using std::endl;
 9 
10 #pragma comment(lib, "ws2_32.lib")
11 
12 int SOCKADDR_IN_SIZE = sizeof(SOCKADDR_IN);
13 const u_short DEFAULT_PORT = 4000;
14 const size_t MSG_BUF_SIZE = 512;
15 const size_t IP_BUF_SIZE = 256;
16 
17 int main() {
18     WSADATA wsa_data;
19     SOCKET sock_serv = INVALID_SOCKET;
20     SOCKADDR_IN addr_serv, addr_clt;
21     char ip_buf[IP_BUF_SIZE];
22     char msg_buf[MSG_BUF_SIZE];
23     int ret_val = 0;
24     //
25     ret_val = WSAStartup(MAKEWORD(2, 2), &wsa_data);
26     if (ret_val != 0) {
27         cerr << "WSAStartup() function failed with error: " << WSAGetLastError() << "\n";
28         system("pause");
29         return 1;
30     }
31     //
32     //SecureZeroMemory(&addr_serv, SOCKADDR_IN_SIZE);
33     addr_serv.sin_family = AF_INET;
34     addr_serv.sin_port = htons(DEFAULT_PORT);
35     addr_serv.sin_addr.S_un.S_addr = ADDR_ANY;
36     //
37     sock_serv = socket(addr_serv.sin_family, SOCK_DGRAM, IPPROTO_UDP);
38     if (sock_serv == INVALID_SOCKET) {
39         cerr << "socket() function failed with error: " << WSAGetLastError() << "\n";
40         WSACleanup();
41         system("pause");
42         return 1;
43     }
44     //
45     ret_val = bind(sock_serv, (SOCKADDR*)&addr_serv, SOCKADDR_IN_SIZE);
46     if (ret_val != 0) {
47         cerr << "bind() function failed with error: " << WSAGetLastError() << "\n";
48         system("pause");
49         return 1;
50     }
51     cout << "A UDP server has started successfully..." << endl;
52     //
53     while (true) {
54         SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
55         ret_val = recvfrom(sock_serv, msg_buf, MSG_BUF_SIZE, 0, (SOCKADDR*)&addr_clt, &SOCKADDR_IN_SIZE);
56         if (ret_val > 0) {
57             inet_ntop(addr_clt.sin_family, &addr_clt, ip_buf, IP_BUF_SIZE);
58             cout << "message from client " << ip_buf << ": " << msg_buf << endl;
59             cout << "enter the message to response: ";
60             cin.getline(msg_buf, MSG_BUF_SIZE);
61             sendto(sock_serv, msg_buf, strlen(msg_buf), 0, (SOCKADDR*)&addr_clt, SOCKADDR_IN_SIZE);
62         }
63         else if (ret_val == 0) {
64             cout << "connection is closed..." << endl;
65         }
66         else {
67             cerr << "recvfrom() function failed with error: " << WSAGetLastError() << "\n";
68             closesocket(sock_serv);
69             WSACleanup();
70             system("pause");
71             return 1;
72         }
73     }
74     ret_val = shutdown(sock_serv, SD_BOTH);
75     if (ret_val == SOCKET_ERROR) {
76         cerr << "shutdown() function failed with error: " << WSAGetLastError() << "\n";
77         closesocket(sock_serv);
78         WSACleanup();
79         system("pause");
80         return 1;
81     }
82     closesocket(sock_serv);
83     WSACleanup();
84     cout << "server shutdown..." << endl;
85     system("pause");
86     return 0;
87 }

客户端:

 1 #include <Winsock2.h>
 2 #include <WS2tcpip.h>
 3 #include <iostream>
 4 
 5 using std::cout;
 6 using std::cin;
 7 using std::cerr;
 8 using std::endl;
 9 
10 #pragma comment(lib, "ws2_32.lib")
11 
12 const int MSG_BUF_SIZE = 512;
13 int SOCKADDR_SIZE = sizeof(SOCKADDR);
14 const int SERV_PORT = 4000;
15 const char *SERV_IP = "127.0.0.1";
16 
17 int main() {
18     WSADATA wsa_data;
19     SOCKET sock_clt = INVALID_SOCKET;
20     SOCKADDR_IN addr_serv;
21     char msg_buf[MSG_BUF_SIZE];
22     int ret_val = 0;
23     //
24     ret_val = WSAStartup(MAKEWORD(2, 2), &wsa_data);
25     if (ret_val != 0) {
26         cerr << "WSAStartup() function failed with error: " << WSAGetLastError() << "\n";
27         system("pause");
28         return 1;
29     }
30     //
31     sock_clt = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
32     if (sock_clt == INVALID_SOCKET) {
33         cerr << "socket() function failed with error: " << WSAGetLastError() << "\n";
34         WSACleanup();
35         system("pause");
36         return 1;
37     }
38     //
39     addr_serv.sin_family = AF_INET;
40     addr_serv.sin_port = htons(SERV_PORT);
41     ret_val = InetPton(addr_serv.sin_family, SERV_IP, &addr_serv.sin_addr);
42     if (ret_val != 1) {
43         cerr << "inet_pton() function failed with error: " << WSAGetLastError() << "\n";
44         closesocket(sock_clt);
45         WSACleanup();
46         system("pause");
47         return 1;
48     }
49     //
50     cout << "A UDP client has already started successfully..." << endl;
51     //
52     //SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
53     while (true) {
54         cout << "enter the message you want to send: ";
55         cin.getline(msg_buf, MSG_BUF_SIZE);
56         ret_val = sendto(sock_clt, msg_buf, strlen(msg_buf), 0, (SOCKADDR*)&addr_serv, SOCKADDR_SIZE);
57         if (ret_val == SOCKET_ERROR) {
58             cerr << "sendto() function failed with error: " << WSAGetLastError() << "\n";
59             closesocket(sock_clt);
60             WSACleanup();
61             system("pause");
62             return 1;
63         }
64         SecureZeroMemory(msg_buf, MSG_BUF_SIZE);
65         ret_val = recvfrom(sock_clt, msg_buf, MSG_BUF_SIZE, 0, (SOCKADDR*)&addr_serv, &SOCKADDR_SIZE);
66         if (ret_val > 0) {
67             cout << "feedback from the server: " << msg_buf << endl;
68         }
69         else if (ret_val == 0) {
70             cout << "connection is closed..." << endl;
71         }
72         else {
73             cerr << "recvfrom() function failed with error: " << WSAGetLastError() << "\n";
74             closesocket(sock_clt);
75             WSACleanup();
76             system("pause");
77             return 1;
78         }
79     }
80     ret_val = shutdown(sock_clt, SD_BOTH);
81     if (ret_val == SOCKET_ERROR) {
82         cerr << "shutdown() function failed with error: " << WSAGetLastError() << "\n";
83         closesocket(sock_clt);
84         WSACleanup();
85         system("pause");
86         return 1;
87     }
88     closesocket(sock_clt);
89     WSACleanup();
90     system("pause");
91     return 0;
92 }

 

posted @ 2016-01-31 22:28  jz_cnblogs  阅读(1454)  评论(0编辑  收藏  举报