我遇到一个简单的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;
}
答案 0 :(得分:0)
有点不同步。实际上服务器是在客户端发送数据报后启动的。问题解决了。