繁体   English   中英

WinSock在同一端口上重新托管不能正常工作C ++

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM