Linux c++recvfrom()更改(销毁)[socket]文件描述符

Linux c++ recvfrom() changes (destroys) the [socket] file descriptor

本文关键字:文件 描述 socket 销毁 c++recvfrom 更改 Linux      更新时间:2023-10-16

我已经编写了一个简单的UDP服务器。当然,我在其中的某个地方使用了recvfrom()函数。我在网上搜索过它,发现它是由缓冲区溢出引起的。这是真的吗?但我不明白为什么我的代码失败并抛出相同的错误,这是与recvfrom():相关的部分

char messageFromClient[1024] = {0};
returnStatus = recvfrom(udpSocket, &messageFromClient, strlen(messageFromClient), 0, (struct sockaddr*)&udpSocket,
                                &addrlen);

调用recvfrom()之前的文件描述符是3,但当我调用它时,它会变为-187301886

您的代码失败,因为您指定了0接收缓冲区大小,并且您将套接字文件描述符作为对等地址参数(覆盖其值)进行传递:

修复:

char messageFromClient[1024];
sockaddr_in addr;
socklen_t addrlen = sizeof addr;
ssize_t received = recvfrom(udpSocket, messageFromClient, sizeof messageFromClient, 0, (sockaddr*)&addr, &addrlen);