[英]WinSock rehost on same port not working properly C++
我有一个程序,它正在端口200上监听。将客户端连接到它之后,从客户端收到的所有数据都将写入std :: cout。 如果从客户端获取数据时发生任何错误,我想重新启动主机。
ServerSocket sock;
while(true)
{
try
{
uint8 buff[1000];
std::cout << "hosting..." << std::endl;
sock.Host(port);
while(true)
{
size_t ret = sock.GetData(buff, 1000);
buff[ret] = '\0';
std::cout << buff << std::endl;
}
}
catch(const SocketException& se)
{
std::cout << se.What() << std::endl;
}
}
第一次连接到此,一切都很好。 如果我关闭客户端,则会发生SocketException(因此开始新的托管)。
主机功能:
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
m_address.sin_family = AF_INET;
m_address.sin_port = htons(port);
m_address.sin_addr.S_un.S_addr = INADDR_ANY;
int optval = 1;
setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(int));
int retval = bind(m_socket, reinterpret_cast<sockaddr*>(&m_address), sizeof(m_address));
if(retval == SOCKET_ERROR)
throw SocketException("bind() error", __FUNCTION__, WSAGetLastError());
retval = listen(m_socket, SOMAXCONN);
if(retval == SOCKET_ERROR)
throw SocketException("listen() error", __FUNCTION__, WSAGetLastError());
m_socket = accept(m_socket, NULL, NULL);
if(m_socket == INVALID_SOCKET)
throw SocketException("accept() error", __FUNCTION__, WSAGetLastError());
我需要setsockopt行,因为我想在发生错误后立即绑定(并且最后一个托管套接字处于TIME_WAIT状态?)。 没有setsockopt,我会遇到bind()错误。 因此,我使用了setsockopt,它使我可以毫无问题地托管在端口上。 但是,当我再次启动客户端并尝试连接到主机时, 没有错误发生,并且我可以再次发送数据。 但是,该程序不接受任何传入连接 (它仍然停留在accept(m_socket,NULL,NULL);等待传入连接的行)。 我假设客户端可以以某种方式连接到旧套接字。 那可能吗?
(注意:如果我在主机函数中添加WSACleanup(); WSAStartup(MAKEWORD(2,2),&m_wsaData);行,那么一切都会按预期工作 。我不知道为什么。WSACleanup(); WSAStartup(MAKEWORD(2) ,2),&m_wsaData);仅在我研究此问题的示例程序中为我提供帮助。在原始程序中,两行均无效。
您正在为每个连接调用bind()
和listen()
。 服务器启动时,应一次执行bind()
和listen()
,然后重复仅调用accept()
。
另外,要正确执行此操作,您应该为每个accept()
调用生成一个新线程,否则,人们只要打开与服务器的连接即可,然后不发送任何内容,便可以使用DOS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.