基於UDP(面向無連線)的socket程式設計
說明:
本程式是基於windows socket的套接字型檔實現網路程式設計;
當WSAStartup函式呼叫成功後,在程式的最後都需要相應的呼叫WSACleanup函式
以便釋放為該應用程式分配的資源,終止對WinSock動態庫的使用。
基於UDP的伺服器端流程
建立套接字(socket)
將套接字和IP地址、埠號繫結在一起(bind)
等待客戶端發起資料通訊(recvfrom/recvto)
關閉套接字
基於UDP的客戶端流程
建立套接字(socket)
向伺服器發起通訊(recvfrom/recvto)
關閉套接字
基於UDP的socket程式設計流程圖
基於UDP的socket程式設計不需要設定監聽和發起/接收請求,可以直接相互通訊,流程如下:
這裡寫圖片描述
伺服器端程式碼:
#include "stdafx.h"
#include <Winsock2.h>
int _tmain(int argc, _TCHAR* argv[])
{
WORD dwVersionReq = MAKEWORD(1,1);
WSAData wsData = {0};
//載入套接字型檔
if (0 != WSAStartup(dwVersionReq,&wsData))
{
WSACleanup();
return 0;
}
//socket版本確認
if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))
{
WSACleanup();
return 0;
}
//建立服務套接字
SOCKET socketSrv = socket(AF_INET,SOCK_DGRAM,0/*自動選擇協議*/);
//對socket繫結埠號和IP地址
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(6000);
addrServer.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
bind(socketSrv,(SOCKADDR*)&addrServer,sizeof(addrServer));
//儲存client端socket資訊
SOCKADDR_IN addClient;
int len = sizeof(SOCKADDR_IN);
while (1)
{
//等待並接收資料
char szBuffer[100] = {0};
recvfrom(socketSrv,szBuffer,100,0,(SOCKADDR*)&addClient,&len);
printf("client->server:%s\n",szBuffer);
//傳送資料
char szSendBuf[100] = "this is server";
sendto(socketSrv, szSendBuf, 100,0,(SOCKADDR*)&addClient,len);
}
//關閉套接字
closesocket(socketSrv);
//關閉winsocket庫
WSACleanup();
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
客戶端程式碼:
#include "stdafx.h"
#include <Winsock2.h>
int _tmain(int argc, _TCHAR* argv[])
{
//指定wind socket版本
WORD dwVersionReq = MAKEWORD(1,1);
WSAData wsData = {0};
//載入套接字型檔dll
if (0 != WSAStartup(dwVersionReq,&wsData))
{
WSACleanup();
return 0;
}
//版本判斷
if (LOBYTE(wsData.wVersion) != 1 || HIBYTE(wsData.wVersion != 1))
{
WSACleanup();
return 0;
}
//建立套接字
SOCKET socketClient = socket(AF_INET,SOCK_DGRAM,0);
//填充伺服器socket資訊
SOCKADDR_IN addrServer;
int nLength = sizeof(addrServer);
addrServer.sin_family = AF_INET;
//伺服器的應用程式埠
addrServer.sin_port = htons(6000);
//伺服器的IP地址,同一臺電腦就是本地IP
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//傳送資料
char szClientBuf[100]= "this is client";
sendto(socketClient,szClientBuf,100,0,(SOCKADDR*)&addrServer,nLength);
//介紹資料
char szRecvBuf[100] = {0};
recvfrom(socketClient,szRecvBuf,100,0,(SOCKADDR*)&addrServer,&nLength);
printf("server->client:%s\n", szRecvBuf);
//關閉套接字
closesocket(socketClient);
//關閉winsocket庫
WSACleanup();
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
測試效果:
這裡寫圖片描述
---------------------
作者:小怪獸and奧特曼
來源:CSDN
原文:https://blog.csdn.net/c_base_jin/article/details/69681066
版權宣告:本文為博主原創文章,轉載請附上博文連結!