UDP socket errno 111

melancholy_444 2012-07-30 11:50:41
很简单的一个UDP程序,向一个没有打开的端口发送消息。Wireshark抓包发现有趣现象

第一次UDP数据发出,对方回ICMP 端口不可达
第二次没有UDP发出,write函数置errno
第三次UDP数据发出,对方回ICMP 端口不可达
第四次没有UDP发出,write函数置errno
如此循环。。。。
就算在第一、第二次之间,对端端口打开,依然发送失败

我现在就希望程序每次都发出UDP包。前提是使用同一个socket,发送期间不close(socket)


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <linux/un.h>
#include <errno.h>

int main(void)
{
int sock_fd = 0;
struct sockaddr_in addr = {0};
char buffer[32] = "abcdefghijklmn";

sock_fd = socket(PF_INET, SOCK_DGRAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(10566);
inet_pton(AF_INET, "172.21.22.12", &addr.sin_addr);

connect(sock_fd, (struct sockaddr *)&addr, sizeof(addr));
if (-1 == write(sock_fd, buffer, sizeof(buffer)))
{
fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno));
}
sleep(1);

if (-1 == write(sock_fd, buffer, sizeof(buffer)))
{
/* Error: 111 Connection refused */
fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno));
}
sleep(1);

if (-1 == write(sock_fd, buffer, sizeof(buffer)))
{
fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno));
}
sleep(1);

if (-1 == write(sock_fd, buffer, sizeof(buffer)))
{
/* Error: 111 Connection refused */
fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno));
}
sleep(1);

if (-1 == write(sock_fd, buffer, sizeof(buffer)))
{
fprintf(stderr, "write failed: %d %s\n", errno, strerror(errno));
}
close(sock_fd);

return 0;
}

...全文
290 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-07-30
  • 打赏
  • 举报
回复
你希望的不是大家关心的, 程序员只需要关心发送函数的返回值, 并且相信数据包并不一定真的到达对方.

UDP不可靠, write/send(需connect通知本地内核绑定remote)/sendto都可以发送udp, 只要本地内核buffer不满就直接返回了,icmp的接受是完全异步的,这一次sendto返回了,过一会收到icmp,下一次sendto才会返回-1告诉你失败。

clear?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧