96.udp通信

运行截图

客户端

  • 创建客户端套接字,用于创建UDP通信
    1 SOCKET socket_client;
  • 创建UDP通信
    1 socket_client = socket(AF_INET, SOCK_DGRAM, 0);
  • 创建客户端结构体保存ip地址以及端口号
    1 SOCKADDR_IN sever;
  • 设置通信模式,通信地址以及通信端口
    1     //设置通信模式
    2     sever.sin_family = AF_INET;
    3     //设置通信地址
    4     sever.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
    5     //开启通信端口
    6     sever.sin_port = htons(8848);
  • 创建字符串用于发送信息
    1     //存储获取的字符串
    2     char strreceive[1024] = { 0 };
    3     //获取的字符串长度
    4     int length;
  • 获取字符串并通过套接字发送到相应的ip地址
    1 //不断进行数据交换
    2     while (1)
    3     {
    4         char str[1024] = { 0 };
    5         fgets(str, 1024, stdin);
    6         //通过套接字发送信息到服务器
    7         sendto(socket_client, str, strlen(str) + 1, 0, &sever, sizeof(SOCKADDR));
    8     }
  • 套接字检测版本信息
     1 //UDP版本,2,2版本
     2     WORD wversion=MAKEWORD(2,2);
     3     //当前版本
     4     WSADATA wsadata;
     5     //获取版本对比,开始通信
     6     int error = WSAStartup(wversion, &wsadata);
     7 
     8     //如果版本与指定的不对则返回
     9     if (error!=0)
    10     {
    11         printf("error");
    12         return;
    13     }
    14 
    15     //取出低八位与高八位进行版本对比
    16     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
    17     {
    18         printf(" version  error");
    19         return;
    20     }
  • 关闭套接字
    1     //关闭
    2     closesocket(socket_client);
    3     //关闭
    4     WSACleanup();

客户端完整代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 //网络通信
 6 #include<winsock.h>
 7 #pragma  comment(lib,"ws2_32.lib")
 8 
 9 void main()
10 {
11     //存储获取的字符串
12     char strreceive[1024] = { 0 };
13     //获取的字符串长度
14     int length;
15     //客户端的套接字,用于创建UDP通信
16     SOCKET socket_client;
17     //创建客户端结构体保存ip地址以及端口号
18     SOCKADDR_IN sever;
19     SOCKADDR_IN severTmp;
20 
21     //UDP版本,2,2版本
22     WORD wversion=MAKEWORD(2,2);
23     //当前版本
24     WSADATA wsadata;
25     //获取版本对比,开始通信
26     int error = WSAStartup(wversion, &wsadata);
27 
28     //如果版本与指定的不对则返回
29     if (error!=0)
30     {
31         printf("error");
32         return;
33     }
34 
35     //取出低八位与高八位进行版本对比
36     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
37     {
38         printf(" version  error");
39         return;
40     }
41     //创建UDP通信
42     socket_client = socket(AF_INET, SOCK_DGRAM, 0);
43 
44     //设置通信模式
45     sever.sin_family = AF_INET;
46     //设置通信地址
47     sever.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
48     //开启通信端口
49     sever.sin_port = htons(8848);
50 
51     
52     //打开文件
53     FILE *pfr = fopen("1.txt", "rb");
54     //不断进行数据交换
55     while (1)
56     {
57         char str[1024] = { 0 };
58         fgets(str, 1024, stdin);
59         //通过套接字发送信息到服务器
60         sendto(socket_client, str, strlen(str) + 1, 0, &sever, sizeof(SOCKADDR));
61 
62     }
63 
64     //关闭
65     closesocket(socket_client);
66     //关闭
67     WSACleanup();
68 
69     system("pause");
70 }

服务器端

  • 创建服务器端套接字,用于创建UDP通信
    1 //服务器套接字,创建UDP通信
    2     SOCKET socket_send;
  • 创建UDP通信
    1 socket_send = socket(AF_INET, SOCK_DGRAM, 0);
  • 创建服务器端结构体保存ip地址以及端口号
    1 SOCKADDR_IN server;
  • 设置通信模式,通信地址以及通信端口
    1 //设置通信方式
    2     server.sin_family = AF_INET;
    3     //获取本地ip信息
    4     server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    5     server.sin_port = htons(8848);//端口
  • 把服务器的ip信息和端口信息与服务器套接字绑定,接收该地址收到的内容
    1 bind(socket_send, &server, sizeof(SOCKADDR));
  • 保存是谁发来的信息的ip
    1 SOCKADDR_IN client;
  • 创建字符串用于接收
    1 //存储获取的字符串
    2     char strreceive[1024] = { 0 };
    3     //存储获取的长度
    4     int length;
  • 通过套接字获取
     1 //获取长度
     2     length = sizeof(SOCKADDR);
     3     while (1)
     4     {
     5         //通过服务器套接字接受信息
     6         recvfrom(socket_send, strreceive, 1024, 0, &client, &length);
     7         if (strlen(strreceive) > 0)
     8         {
     9             printf("收到%s
    ", strreceive);
    10             printf("%d
    ", client.sin_addr.S_un.S_addr);
    11             memset(strreceive, 0, 1024);
    12         }
    13     }
  • 版本检测
     1 //版本,2,2版本
     2     WORD wversion = MAKEWORD(2, 2);
     3     //当前版本
     4     WSADATA wsadata;
     5     //获取版本对比,开始通信
     6     int error = WSAStartup(wversion, &wsadata);
     7 
     8     //如果版本与指定的不对则返回
     9     if (error != 0)
    10     {
    11         printf("error");
    12         return;
    13     }
    14 
    15     //取出低八位,高八位,对比版本
    16     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
    17     {
    18         printf(" version  error");
    19         return;
    20     }
  • 关闭
    1 closesocket(socket_send);//关闭
    2     WSACleanup();

完整代码

 1 #define  _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 #include <stdlib.h>
 4 #include <string.h>
 5 //网络通信
 6 #include<winsock.h>
 7 #pragma  comment(lib,"ws2_32.lib")
 8 
 9 
10 void main()
11 {
12     //存储获取的字符串
13     char strreceive[1024] = { 0 };
14     //存储获取的长度
15     int length;
16     //服务器套接字,创建UDP通信
17     SOCKET socket_send;
18     //创建服务器端结构体保存ip地址以及端口号
19     SOCKADDR_IN server;
20     //保存是谁发来的信息的ip
21     SOCKADDR_IN client;  
22 
23     //版本,2,2版本
24     WORD wversion = MAKEWORD(2, 2);
25     //当前版本
26     WSADATA wsadata;
27     //获取版本对比,开始通信
28     int error = WSAStartup(wversion, &wsadata);
29 
30     //如果版本与指定的不对则返回
31     if (error != 0)
32     {
33         printf("error");
34         return;
35     }
36 
37     //取出低八位,高八位,对比版本
38     if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
39     {
40         printf(" version  error");
41         return;
42     }
43 
44     //创建UDP通信
45     socket_send = socket(AF_INET, SOCK_DGRAM, 0);
46 
47     //设置通信方式
48     server.sin_family = AF_INET;
49     //获取本地ip信息
50     server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
51     server.sin_port = htons(8848);//端口
52 
53     //把服务器的ip信息和端口信息与服务器套接字绑定
54     bind(socket_send, &server, sizeof(SOCKADDR));
55     //获取长度
56     length = sizeof(SOCKADDR);
57     while (1)
58     {
59         //通过服务器套接字接受信息
60         recvfrom(socket_send, strreceive, 1024, 0, &client, &length);
61         if (strlen(strreceive) > 0)
62         {
63             printf("收到%s
", strreceive);
64             printf("%d
", client.sin_addr.S_un.S_addr);
65             memset(strreceive, 0, 1024);
66         }
67     }
68 
69     closesocket(socket_send);//关闭
70     WSACleanup();
71 
72     system("pause");
73 
74 
75 }
原文地址:https://www.cnblogs.com/xiaochi/p/8468014.html