#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
struct sockaddr_in addr;
int fd, cnt,ret;
char ch = 'y',msg[] ="How are you";
if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
printf("Error: socket");
exit(1);
}
printf("\nDone socket\n");
/* set up destination address */
memset(&addr,0,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("128.88.143.113");
addr.sin_port=htons(9090);
ret=connect(fd,(struct sockaddr *)&addr,sizeof(addr));
perror("Connect:");
while(ch == 'y'){
cnt = send(fd,msg,sizeof(msg),0);
if(cnt < 0)
perror("send:");
printf("\nNumber of bytes sent = %d , \n",cnt);
printf("Continue (y/n)\n");
scanf(" %c",&ch);
}
return 0;
}
上面的代码被编译为可以在Linux机器上运行。
假设上面的代码将数据发送到IP地址为
128.88.143.113
的计算机。在9090
处,没有UDP套接字绑定(bind)到端口128.88.143.113
。在
while
循环中,对send()
的第一个调用成功(该数据包实际上从线路上断开;使用trace
对其进行了检查),而第二个send()
失败,并通过Connection refused
进行了调用。 third send()
成功,第四次失败,依此类推。我怀疑在第一个
send()
之后,堆栈会收到保存在套接字结构中的ICMP错误消息(在Linux机器上的tcpdump
中看到)。看到此错误后,第二个send()
失败,并且实际上没有发送任何数据包。第二个send()
也清除套接字结构中的错误。因此,第三个send()
成功,第四个send()
失败,依此类推。问题:
最佳答案
根据linux man page for udp:
具体来说,RFC(4.1.3.3)指出:
关于c - connect()之后的UDP发送行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4397195/