首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >recvfrom()不阻塞

recvfrom()不阻塞
EN

Stack Overflow用户
提问于 2012-10-07 13:52:58
回答 1查看 3.9K关注 0票数 1

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

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

代码语言:javascript
复制
    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);
    }

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-07 14:00:04

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

代码语言:javascript
复制
sockfd = socket(AF_INET, SOCK_STREAM, 0);

你想要做的可能是;

代码语言:javascript
复制
sockfd = socket(AF_INET, SOCK_DGRAM, 0);

尝试在未连接的流套接字上执行recvfrom很可能会立即返回错误。下一次,您可能希望检查errno以获得提示。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12766458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档