Posted on 2009-10-19 15:23
lantionzy 阅读(1973)
评论(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网络编程应注意的几个地方