linux下的udp调试工具,编写Linux下的UDP Client/Server程序

#define MAXLINE 80

#define SERV_PORT 8888

void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)

{

int n;

char sendline[MAXLINE], recvline[MAXLINE + 1];

/* connect to server */

if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)

{

perror("connect error");

exit(1);

}

while(fgets(sendline, MAXLINE, fp) != NULL)

{

/* read a line and send to server */

write(sockfd, sendline, strlen(sendline));

/* receive data from server */

n = read(sockfd, recvline, MAXLINE);

if(n == -1)

{

perror("read error");

exit(1);

}

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

fputs(recvline, stdout);

}

}

int main(int argc, char **argv)

{

int sockfd;

struct sockaddr_in servaddr;

/* check args */

if(argc != 2)

{

printf("usage: udpclient \n");

exit(1);

}

/* init servaddr */

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(SERV_PORT);

if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)

{

printf("[%s] is not a valid IPaddress\n", argv[1]);

exit(1);

}

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

return 0;

}

五、运行例子程序

1、编译例子程序

使用如下命令来编译例子程序:

gcc -Wall -o udpserv udpserv.c

gcc -Wall -o udpclient udpclient.c

编译完成生成了udpserv和udpclient两个可执行程序。

2、运行UDP Server程序

执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN

udp 0 0 0.0.0.0:32768 0.0.0.0:*

udp 0 0 0.0.0.0:8888 0.0.0.0:*

udp 0 0 0.0.0.0:111 0.0.0.0:*

udp 0 0 0.0.0.0:882 0.0.0.0:*

可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。

如果这时再执行./udpserv &命令,就会看到如下信息:

bind error: Address already in use

说明已经有一个服务程序在运行了。

3、运行UDP Client程序

执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:

Hello, World!

Hello, World!

this is a test

this is a test

^d

输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。

如果服务程序没有启动,而执行客户程序,就会看到如下信息:

$ ./udpclient 127.0.0.1

test

read error: Connection refused

说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果你使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值