recvfrom() 不阻塞

Mas*_*rry 1 c sockets

出于某种原因,我的套接字的 recvfrom() 函数没有像预期的那样阻塞我的服务器代码。我正在制作一个基本的 UDP 服务器来创建一个滚动会话密钥系统。

我在这里做错了什么?它在此行之后继续(在我放置 (n < 1) 之前)并且正在崩溃。我很确定 recvfrom() 应该停止程序的执行,直到它从客户端得到一些东西......

    int sockfd, portNumber;
    socklen_t clilen;
    char buffer[BUFFER_LENGTH];
    struct sockaddr_in serv_addr, from;
    int n;

    // Invalid arguments
    if (argc < 2)
        exit(0);
    else if (atoi(argv[1]) > 65535 || atoi(argv[1]) < 1)
        exit(0);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        printf("Error opening socket.\n");
        exit(0);
    }

    // Taken from reference
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portNumber = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portNumber);
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) 
    {
        printf("ERROR on binding.\n");
        close(sockfd);
        exit(0);
    }

    // Get initial session key request
    int fromlen = sizeof(struct sockaddr_in);
    n = recvfrom(sockfd, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&from, &fromlen);
    if (n < 0)
    {
        printf("Error in receiving.\n");
        exit(1);
    }
Run Code Online (Sandbox Code Playgroud)

谢谢

Joa*_*son 5

您正在尝试为 UDP 使用流套接字;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
Run Code Online (Sandbox Code Playgroud)

你的意思可能是;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
Run Code Online (Sandbox Code Playgroud)

尝试recvfrom在未连接的流套接字上执行操作很可能会立即返回并显示错误。下一次,您可能需要检查errno提示。

  • 如上所述,如果您使用 SOCK_STREAM,您将不得不监听并接受传入连接。然后你可以对它们使用 recvfrom 。 (2认同)