UDP客户端框架的main函数主要就是用请求的对等实体地址和端口号填充peer,并获取一个SOCK_DGRAM套接字。图2-23显示了main函数。框架的其余部分与udpserver.skel相同。
|
图2-23 udpclient.skel的main函数 |
将udpclient.skel复制到udphelloc.c中,并用
- static void client( SOCKET s, struct sockaddr_in *peerp )
- {
- int rc;
- int peerlen;
- char buf[ 120 ];
- peerlen = sizeof( *peerp );
- if ( sendto( s, "", 1, 0, ( struct sockaddr * ) peerp,
- peerlen ) < 0 )
- error( 1, errno, "sendto failed" );
- rc = recvfrom( s, buf, sizeof( buf ), 0,
- ( struct sockaddr * )peerp, &peerlen );
- if ( rc >= 0 )
- write( 1, buf, rc );
- else
- error( 1, errno, "recvfrom failed" );
-
填充客户端占位程序,以此来试用这个框架,同时对udphello进行测试。
函数client只是向服务器发送了一个空字节,读取得到的数据报,将其写入stdout,然后退出。发送空字节满足了udphello中recvfrom的要求,它会返回,这样udphello就可以发送其数据报了。
运行这两个程序时,可以得到常见的问候语,如下。
- bsd: $ udphello 9000 $
- [1] 448
- bsd: $ udphelloc localhost 9000
- hello, world
- bsd: $
像往常一样,将构建代码从main中抽取出来放入库函数中。注意,库函数udp_client(图2-24)的第三个变元是sockaddr_in结构的地址,函数会用前两个变元指定的地址和端口号来填充这个结构。
- #include "etcp.h"
-
- SOCKET udp_client( char *host, char *port,
- struct sockaddr_in *sap );
-
- 返回:一个UDP套接字,并填充好sockaddr_in结构
|
(点击查看大图)图2-24 函数udp_client |
【责任编辑: 云霞 TEL:(010)68476606】 |