c ++:TCP服务器"bind"功能失败(errno 98),如果我在两次连续应用程序启动之间没有等待足够的时间
c++ : TCP Server "bind" function failed (errno 98) if I do not wait enough time between two consecutive app launch
发现TCP套接字时,我根据对主题的理解和在网络上发现的一些教程进行了一个非常简单的测试
服务器:
void Server(void)
{
int localSocket;
int distantSocket;
sockaddr_in serverInfo;
sockaddr_in clientInfo;
int sizeOfSocketInfo = sizeof(struct sockaddr_in);
/* Open Socket */
std::cout << "open socket" << std::endl;
localSocket = socket(AF_INET, SOCK_STREAM, 0);
if (localSocket == -1)
{
std::cout << "open failed, error - " << (int)errno << std::endl;
exit(errno);
}
/* Configure server */
serverInfo.sin_addr.s_addr = INADDR_ANY;
serverInfo.sin_family = AF_INET;
serverInfo.sin_port = htons(61001);
/* Bind Socket */
std::cout << "bind socket" << std::endl;
if (bind (localSocket, (sockaddr *) &serverInfo, sizeof(serverInfo)) == -1)
{
std::cout << "bind failed, error - " << (int)errno << std::endl;
exit(errno);
}
/* Wait for client */
std::cout << "Wait for client ..." << std::endl;
listen(localSocket, 1);
distantSocket = accept(localSocket, (sockaddr *)&clientInfo, (socklen_t*)&sizeOfSocketInfo);
std::cout << "client connected - " << inet_ntoa(clientInfo.sin_addr) << std::endl;
/* Close Socket */
close (localSocket);
close (distantSocket);
std::cout << "socket closed" << std::endl;
}
和客户端:
void Client(void)
{
int localSocket;
sockaddr_in clientInfo;
/* Open Socket */
std::cout << "open socket" << std::endl;
localSocket = socket(AF_INET, SOCK_STREAM, 0);
if (localSocket == -1)
{
std::cout << "open failed, error - " << (int)errno << std::endl;
exit(errno);
}
clientInfo.sin_family = AF_INET;
clientInfo.sin_port = htons(61001);
clientInfo.sin_addr.s_addr = inet_addr("127.0.0.1");
/* Open Socket */
std::cout << "connect to server" << std::endl;
if (connect(localSocket, (sockaddr*)&clientInfo, sizeof(clientInfo)) < (int)0)
{
std::cout << "connect failed, error - " << (int)errno << std::endl;
exit(errno);
}
std::cout << "connected !" << std::endl;
close(localSocket);
}
当我在一个终端中启动服务器,在另一个终端启动客户端时,似乎还可以:
服务器端:
> ./tcpTest -s
open socket
bind socket
Wait for client ...
client connected - 127.0.0.1
socket closed
>
和客户端:
> ./tcpTest -c
open socket
connect to server
connected !
>
但是,如果在第一次尝试之后,我再次启动服务器。。。
> ./tcpTest -s
open socket
bind socket
bind failed, error - 98
>
我必须等待一段"特定的时间",我不知道确切的时间,也许一分钟,才能让服务器重新工作。
我不知道发生了什么,用sockstat
打开套接字并没有显示任何奇怪的东西(我只看到mozilla套接字)。
我发现这个家伙也有同样的问题,但在Ruby基本的Ruby TCP服务器演示在启动时失败:`bind';:地址已在使用中,错误号::EADDRINUSE
如果这真的是同一个问题,我如何在C++中应用相同的解决方案?或者你知道吗?
感谢
您可能需要同时使用SO_REUSEADDR和SO_REUSEPORT。您可以进一步浏览Socket:Socket Docs 的文档
const int trueFlag = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &trueFlag, sizeof(int)) < 0)
error("Failure");
您可以以类似的方式使用重用端口。希望这能帮助
尝试setsockopt(SO_REUSEADDR)
,这应该会有所帮助。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 如何创建一个空的全局类并在启动时实例化它
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 可以使用QSettings或其他类在每次启动时存储一些设置(但在启动之间重置)吗?
- c ++:TCP服务器"bind"功能失败(errno 98),如果我在两次连续应用程序启动之间没有等待足够的时间
- 默认启动策略和std::launch::deferred之间的区别
- 如何使用MPI在多个独立启动的程序之间传输数据