1. 程式人生 > >96.udp通信

96.udp通信

stdlib.h sock war gpo soc span 端口 完整 blog

運行截圖

技術分享圖片

客戶端

  • 創建客戶端套接字,用於創建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\n", strreceive);
    10             printf("%d\n", 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\n", strreceive);
64             printf("%d\n", 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 }

96.udp通信