gpt4 book ai didi

c - recvfrom() 不阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:43 24 4
gpt4 key购买 nike

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

我在这里做错了什么?它在这一行之后继续(在我放置 (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);
}

谢谢

最佳答案

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

sockfd = socket(AF_INET, SOCK_STREAM, 0);

你的意思大概是;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

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

关于c - recvfrom() 不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12766458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com