unix网络编程卷一: 第八章:简单UDP客户端服务器通信(一)

来源:互联网 发布:制作pdf的软件 编辑:程序博客网 时间:2024/05/16 17:58

服务器代码 udpserv01.c:

#include "unp.h"

int main(int argc, char **argv)

{

intsockfd;

struct sockaddr_inservaddr, cliaddr;


sockfd = Socket(AF_INET, SOCK_DGRAM,0);//创建socket


bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family      = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port        = htons(SERV_PORT);


Bind(sockfd, (SA *) &servaddr,sizeof(servaddr));//绑定socket 


dg_echo(sockfd, (SA *) &cliaddr,sizeof(cliaddr));//具体处理和客户端之间的通信

}


dg_echo.c:

#include "unp.h"

void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)

{

intn;

socklen_tlen;

charmesg[MAXLINE];


for ( ; ; ) {

len = clilen;

n = Recvfrom(sockfd, mesg, MAXLINE,0, pcliaddr, &len);//获取客户端发来的消息


Sendto(sockfd, mesg, n,0, pcliaddr, len);//发送消息给客户端

}

}



客户端 udpcli01.c:

#include "unp.h"

int main(int argc, char **argv)

{

intsockfd;

struct sockaddr_inservaddr;


if (argc !=2)

err_quit("usage: udpcli <IPaddress>");


bzero(&servaddr,sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(SERV_PORT);

Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);//转换格式

sockfd = Socket(AF_INET, SOCK_DGRAM,0);//创建socket


dg_cli(stdin, sockfd, (SA *) &servaddr,sizeof(servaddr)); //具体处理和服务器的通信


exit(0);

}


dg_cli.c:

#include "unp.h"

void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

{

intn;

charsendline[MAXLINE], recvline[MAXLINE +1];


while (Fgets(sendline, MAXLINE, fp) !=NULL) {//从输入设备获取信息


Sendto(sockfd, sendline, strlen(sendline),0, pservaddr, servlen);//向服务器发送信息


n = Recvfrom(sockfd, recvline, MAXLINE,0,NULL, NULL);//接受服务器发来的信息


recvline[n] = 0;/* null terminate */

Fputs(recvline, stdout);//显示到输出设备

}

}




打开服务器:

➜  udpcliserv ./udpserv01         



打开客户端:

➜  udpcliserv ./udpcli01 127.0.0.1


打开tcpdump监听:

sh-3.2# tcpdump -i lo0 port 9877

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes



发现udp客户端连接服务器的时候彼此不进行通信,这点和tcp不一样!


然后接着继续测试:
客户端输入hello:

➜  udpcliserv ./udpcli01 127.0.0.1

hello

hello


此时继续查看监听信息发现:

sh-3.2# tcpdump -i lo0 port 9877

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes

15:08:06.567545 IP localhost.57676 > localhost.9877: UDP, length 6

15:08:06.567653 IP localhost.9877 > localhost.57676: UDP, length 6


只有2条信息,一条从客户端向服务器发送的消息,一条从服务器返回客户端的消息, 9877是服务器默认打开的端口,57676是客户端随机打开的端口,length=6应该是客户端发送信息的长度+1个结束符号

不仅如此,继续探究还发现,当客户端断开连接,或者服务器断开连接的时候,彼此都不发送通信消息!就这么突然的断了,然后。。。没然后了。。。


客户端和服务器谁先启动都无所谓,但是注意的一点,如果客户端先启动了,并且发送了消息,此时服务器还未启动,那么客户端会阻塞,即便当服务器启动了之后,客户端也一直会阻塞!


0 0
原创粉丝点击