recvfrom()未阻塞

recvfrom()未阻塞,c,sockets,C,Sockets,出于某种原因,套接字的recvfrom()函数没有像预期的那样在服务器代码上阻塞。我正在制作一个基本的UDP服务器来创建一个滚动会话密钥系统 我做错了什么?它在这一行之后继续运行(在我放置(n

出于某种原因,套接字的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);
    }
intsockfd,端口号;
socklen_t clilen;
字符缓冲区[缓冲区长度];
服务地址中的结构sockaddr\u,来自;
int n;
//无效参数
如果(argc<2)
出口(0);
else如果(atoi(argv[1])>65535 | | atoi(argv[1])<1)
出口(0);
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf(“打开套接字时出错。\n”);
出口(0);
}
//参考
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(端口号);
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
{
printf(“绑定错误。\n”);
关闭(sockfd);
出口(0);
}
//获取初始会话密钥请求
int fromlen=sizeof(结构sockaddr\u in);
n=recvfrom(sockfd,buffer,buffer_LENGTH,0,(struct sockaddr*)和from,以及fromlen);
if(n<0)
{
printf(“接收错误。\n”);
出口(1);
}

谢谢

您正在尝试将流套接字用于UDP

sockfd = socket(AF_INET, SOCK_STREAM, 0);
你想做的可能是

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

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

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

sockfd = socket(AF_INET, SOCK_STREAM, 0);
你想做的可能是

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

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

这不是错误,您只是遇到了一个非阻塞套接字。您正在创建一个流套接字并绑定它,但您没有执行侦听或接受。这是udp…我认为我们不应该使用侦听或接受?我们正在为我的分配创建可靠的udp套接字系统不,您没有。流套接字是TCP套接字。这不是错误,您只是遇到了一个非阻塞套接字。您正在创建流套接字并绑定它,但您没有执行侦听或接受。这是udp…我认为我们不应该使用侦听或接受?我们正在为我的分配创建一个可靠的udp套接字系统不,您没有。流套接字是TCP套接字。如上所述,如果使用SOCK_流,则必须侦听并接受传入连接。然后你可以在他们身上使用recvfrom。谢谢!这是一个多么愚蠢的错误,已经很晚了……哈哈,我对sockets是新手:P我真的很感激,我相信我会回来得到更多需要的帮助,正如上面提到的那样,如果你使用SOCK_流,你将不得不倾听并接受传入的连接。然后你可以在他们身上使用recvfrom。谢谢!这是一个多么愚蠢的错误,已经很晚了…哈哈,我对sockets是新手:P我真的很感激,我相信我会回来得到更多需要的帮助xD