#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机器上运行。连接后的UDP发送行为()
假设上述代码将数据发送到IP地址为128.88.143.113
的计算机。没有UDP套接字绑定到端口9090
在128.88.143.113
。
在while
循环,以send()
第一个呼叫成功(文实际熄灭在电线上;它使用trace
选中)和第二send()
失败Connection refused
。 third send()
成功,第四次失败等。
我怀疑在第一个send()
之后,堆栈收到一个ICMP错误信息(在Linux机器上的tcpdump
中),这个信息保存在套接字结构中。第二个send()
在看到这个错误后失败,实际上没有数据包被发送出去。第二个send()
也清除了套接字结构中的错误。所以第三个send()
成功,第四个失败等等。
问题:
- 这是假设是正确的?
- 什么应该是正确的行为?有没有任何RFC标准定义这种行为?
- 由于UDP不保持任何连接状态,因此不应该每个
send()
成功?
通过别名界面发送时,我在arch linux机器上看到了类似的行为。这解决了吗? – 2011-12-20 10:10:56