Posted on 2009-10-19 15:23
lantionzy 阅读(1963)
评论(3) 编辑 收藏 引用 所属分类:
C++ Primer
注:本系列文章适合初学网络编程的读者
新建一个空的Win32 Console Application类型的工程,在其中添加实现基于UDP的服务器端程序的代码UDPSrv.cpp:
UDP Server
1#include <Winsock2.h>
2#include <stdio.h>
3
4void 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
4void 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网络编程应注意的几个地方