剖析網絡編程(2)-- 基于UDP的的網絡應用程序
Posted on 2009-10-19 15:23 lantionzy 閱讀(1983) 評論(3) 編輯 收藏 引用 所屬分類: C++ Primer 注:本系列文章適合初學網絡編程的讀者
新建一個空的Win32 Console Application類型的工程,在其中添加實現基于UDP的服務器端程序的代碼UDPSrv.cpp:

UDP Server
1
#include <Winsock2.h>
2
#include <stdio.h>
3
4
void main()
5

{
6
WORD wVersionRequested;
7
WSADATA wsaData;
8
int err;
9
10
wVersionRequested = MAKEWORD( 1, 1 );
11
12
err = WSAStartup( wVersionRequested, &wsaData );
13
if ( err != 0 )
14
{
15
return;
16
}
17
18
19
if ( LOBYTE( wsaData.wVersion ) != 1 ||
20
HIBYTE( wsaData.wVersion ) != 1 )
21
{
22
WSACleanup( );
23
return;
24
}
25
26
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
27
SOCKADDR_IN addrSrv;
28
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
29
addrSrv.sin_family=AF_INET;
30
addrSrv.sin_port=htons(12345);
31
32
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
33
34
int ret=WSAGetLastError();
35
printf("%d\n",ret);
36
37
SOCKADDR_IN addrClient;
38
int len=sizeof(SOCKADDR);
39
char recvBuf[1000];
40
41
memset(recvBuf,0,1000);
42
43
recvfrom(sockSrv,recvBuf,1000,0,(SOCKADDR*)&addrClient,&len);
44
ret=WSAGetLastError();
45
printf("%d\n",ret);
46
printf("%s\n",recvBuf);
47
48
closesocket(sockSrv);
49
WSACleanup();
50
}
新建另外一個空的Win32 Console Application類型的工程,在其中添加實現基于UDP的客戶端程序的代碼UDPClient.cpp:

UDP Client
1
#include <Winsock2.h>
2
#include <stdio.h>
3
4
void main()
5

{
6
WORD wVersionRequested;
7
WSADATA wsaData;
8
int err;
9
10
wVersionRequested = MAKEWORD( 1, 1 );
11
12
err = WSAStartup( wVersionRequested, &wsaData );
13
if ( err != 0 )
14
{
15
return;
16
}
17
18
19
if ( LOBYTE( wsaData.wVersion ) != 1 ||
20
HIBYTE( wsaData.wVersion ) != 1 )
21
{
22
WSACleanup( );
23
return;
24
}
25
26
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
27
SOCKADDR_IN addrSrv;
28
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
29
addrSrv.sin_family=AF_INET;
30
addrSrv.sin_port=htons(12345);
31
32
sendto(sockClient,"Hello",strlen("Hello")+1,0,
33
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
34
35
closesocket(sockClient);
36
WSACleanup();
37
}
對于基于UDP的服務器來說,就是一個客戶端,不用建立監聽或者說建立連接,直接調用recvfrom函數接收數據。注意,在編寫基于UDP的網絡程序時,在接收數據時,使用的是recvfrom函數。而前面基于TCP的服務器端程序接收數據時使用的是recv函數。
客戶端也可以直接發送數據,這里需要調用sendto函數而不是send函數。
運行示例中的服務器端程序和客戶端程序,服務器端收到一條信息:Hello。這里服務器端作為接收端,客戶端作為發送端。
剖析網絡編程(1)-- 基于TCP的的網絡應用程序
剖析網絡編程(3)-- 基于TCP/UDP網絡編程應注意的幾個地方
新建一個空的Win32 Console Application類型的工程,在其中添加實現基于UDP的服務器端程序的代碼UDPSrv.cpp:


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

新建另外一個空的Win32 Console Application類型的工程,在其中添加實現基于UDP的客戶端程序的代碼UDPClient.cpp:


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

對于基于UDP的服務器來說,就是一個客戶端,不用建立監聽或者說建立連接,直接調用recvfrom函數接收數據。注意,在編寫基于UDP的網絡程序時,在接收數據時,使用的是recvfrom函數。而前面基于TCP的服務器端程序接收數據時使用的是recv函數。
客戶端也可以直接發送數據,這里需要調用sendto函數而不是send函數。
運行示例中的服務器端程序和客戶端程序,服務器端收到一條信息:Hello。這里服務器端作為接收端,客戶端作為發送端。
剖析網絡編程(1)-- 基于TCP的的網絡應用程序
剖析網絡編程(3)-- 基于TCP/UDP網絡編程應注意的幾個地方