96.udp通信
阿新 • • 發佈:2018-02-25
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
- 創建字符串用於發送信息
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 //通過套接字發送信息到服務器
- 套接字檢測版本信息
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
- 關閉套接字
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通信