【问题标题】:C++ TCP server-client little issueC++ TCP server-client 小问题
【发布时间】:2015-12-13 09:56:42
【问题描述】:

我有一个 TCP 服务器和客户端。服务器代码部分:

/*int Main()*/
while(1)
{
    client_socket = accept (my_socket, (sockaddr *)&client_addr, &client_addrlen);


    nclients++;

    HOSTENT *my_host;
    my_host = gethostbyaddr((char *)&client_addr.sin_addr.S_un.S_addr, 4, AF_INET);
    htons(client_addr.sin_port));
    printf("Client name: %s\n", (my_host) ? my_host->h_name : "");
    printf("Client IP: %s\n", inet_ntoa(client_addr.sin_addr)); //here is client IP

    PRINTNUSERS;
    DWORD threadID;
    CreateThread(NULL, NULL, ClientFunc, &client_socket, NULL, &threadID);
}

对于每个新客户,我想创建一个新线程来处理它

DWORD WINAPI ClientFunc(LPVOID client_socket)
{
SOCKET Thread_sock;
Thread_sock = ((SOCKET *)client_socket)[0];
SOCKADDR_IN Thread_addr;   //how can i connect thread IP with client IP
/*send(), recv() operations*/
}

我想在我的线程中打印客户端 IP。 如何获取位于 Thread_addr.sin_addrstructure 中的客户端 IP 地址。我的客户端 IP 地址位于我的 int main()function 上,但如何将其与线程连接?

【问题讨论】:

    标签: c++ multithreading sockets winapi tcp


    【解决方案1】:

    WINApi 中的线程函数只有一个参数。而且您已经不正确地将它用于您的套接字 - 您正在将局部变量的地址传递给线程。当你的线程正在执行时,这个局部变量将会丢失,并且会在这个地址上存在一些完全不同的东西。有以下解决方案:

    • 首选解决方案。抛弃 WinApi 线程(顺便说一句,您使用不正确。C++ 程序不应该使用 CreateThread,而是 beginthreadex_。改用 C++ 线程函数。这样,​​您将获得一种将参数传递给线程函数的方法,就像您对任何其他函数所做的那样,并且您不必传递地址(您仍然无法这样做!)或参考。
    • 更糟糕的解决方案。将所有参数打包到结构中,在堆上分配结构并传递该结构的地址。在线程函数中解包参数并删除结构。

    【讨论】:

    • 我将尝试使用 std::thread 并将 2 个参数传递给线程(套接字和 IP 地址)。
    • 呃,我不明白。你有没有说,我无法将地址传递给线程?
    • @N.Zazulin,您不应该将局部变量的地址传递给线程。无论您为线程使用哪种管理系统,到线程开始执行时,地址都将毫无意义——当然,除非您在离开当前范围之前等待线程完成。本机线程的缺点是它们只能接收到地址!因此,为了向它们传递任何东西,您需要在堆上分配结构(例如,使用 new)并传递该结构的地址。 C++ 线程没有这个限制。
    • 您可以将对象按值传递给那些。
    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多