bind()在Linux上抛出错误EINVAL,UDP服务器

时间:2018-03-23 20:35:12

标签: c linux server udp bind

我遇到一个简单的UDP服务器实现问题。我有以下代码在一个小的独立应用程序中运行良好。但是如果我只是将其复制粘贴到另一个更复杂的应用程序中,它就会失败 - bind()函数返回-1并将errno设置为22(EINVAL)。这个另一个应用程序还有一个运行良好的TCP服务器,它在应用程序启动时启动。伙计们,你的想法,为什么我有问题。提前谢谢!

UPD:顺便说一下,getsockname()函数在该应用程序中有时也会失败(它表示句柄无效)。

UPD 2:感谢 fbynite 我修复了代码中的拼写错误。现在bind()不返回任何错误,但recvfrom()正在冻结。当然,数据报是从客户端发送的

int handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (handle < 0)
{
    std::cout << "socket(): " << std::strerror(errno)) << std::endl;
    return;
}

sockaddr_in addr;

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(6660);

if (bind(handle, (sockaddr*)&addr, sizeof(addr)) < 0)
{
    std::cout << "bind(): " << std::strerror(errno)) << std::endl;
    close(handle);
    return;
}
else
{
    sockaddr cl;
    socklen_t clLen;
    char buffer[100];

    int bytes = recvfrom(handle, buffer, 100, 0, &cl, &clLen);

    buffer[bytes] = '\0';
    std::cout << buffer << std::endl;
}

1 个答案:

答案 0 :(得分:0)

有点不同步。实际上服务器是在客户端发送数据报后启动的。问题解决了。