#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()失败,依此类推。

问题:
  • 这个假设正确吗?
  • 正确的行为应该是什么?是否有任何RFC标准定义了这种行为?
  • 由于UDP不保持任何连接状态,所以不是每个ojit_code都成功吗?
  • 最佳答案

    根据linux man page for udp:



    具体来说,RFC(4.1.3.3)指出:

    关于c - connect()之后的UDP发送行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4397195/

    10-13 21:51