Problem with transferring the socket as a flow argument



  • When I hand over the socket as an argument, the flow accept gives a mistake 10061.

    #include <iostream>
    #pragma comment(lib, "ws2_32.lib")
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <thread>
    #include <chrono>
    #include <string>
    

    std::string ip = "25.82.45.163";

    wchar_t* toPCW(const std::string s)
    {
    const char* charArray = &s[0];
    wchar_t* wString = new wchar_t[4096];
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
    return wString;
    }

    void th1(int port) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKADDR_IN sock_addr;
    InetPton(AF_INET, toPCW(ip), &sock_addr.sin_addr.s_addr);
    sock_addr.sin_port = htons(port);
    sock_addr.sin_family = AF_INET;
    connect(s, (SOCKADDR*)&sock_addr, sizeof(sock_addr));
    std::cout << "sent\n";
    std::cout << WSAGetLastError() << '\n';
    }

    void th2(SOCKET s) {
    listen(s, SOMAXCONN);

    SOCKADDR c;
    int size = sizeof(c);
    
    SOCKET s1 = accept(s, &amp;c, &amp;size);
    std::cout &lt;&lt; "recieved\n";
    std::cout &lt;&lt; WSAGetLastError() &lt;&lt; '\n';
    

    }

    int main()
    {
    WSADATA WSAdata;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &WSAdata) != 0) {
    std::cout << "EROR WSAStartup\n";
    exit(1);
    }

    SOCKADDR_IN recv_TCP_addr;
    recv_TCP_addr.sin_addr.s_addr = INADDR_ANY;
    recv_TCP_addr.sin_port = 0;
    recv_TCP_addr.sin_family = AF_INET;
    int recv_TCP_size = sizeof(recv_TCP_addr);
    
    SOCKET recv_TCP_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    bind(recv_TCP_socket, (SOCKADDR*)&amp;recv_TCP_addr, recv_TCP_size);
    
    getsockname(recv_TCP_socket, (SOCKADDR*)&amp;recv_TCP_addr, &amp;recv_TCP_size);
    int recv_port = recv_TCP_addr.sin_port;
    
    std::thread th21(th2, recv_TCP_socket);
    std::thread th11(th1, recv_port);
    th21.detach();
    th11.detach();
    
    std::this_thread::sleep_for(std::chrono::seconds(10));
    
    return 0;
    

    }

    But when I turn the flow only to the port and I'm already in the flow, I'm creating a juket and the binja works.

    #include <iostream>
    #pragma comment(lib, "ws2_32.lib")
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <thread>
    #include <chrono>
    #include <string>

    std::string ip = "25.82.45.163";

    wchar_t* toPCW(const std::string s)
    {
    const char* charArray = &s[0];
    wchar_t* wString = new wchar_t[4096];
    MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096);
    return wString;
    }

    void th1(int port) {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    SOCKADDR_IN sock_addr;
    InetPton(AF_INET, toPCW(ip), &sock_addr.sin_addr.s_addr);
    sock_addr.sin_port = htons(port);
    sock_addr.sin_family = AF_INET;
    connect(s, (SOCKADDR*)&sock_addr, sizeof(sock_addr));
    std::cout << "sent\n";
    std::cout << WSAGetLastError() << '\n';
    }

    void th2(int port) {
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    SOCKADDR_IN sock_addr;
    InetPton(AF_INET, toPCW(ip), &amp;sock_addr.sin_addr.s_addr);
    sock_addr.sin_port = htons(port);
    sock_addr.sin_family = AF_INET;
    
    bind(s, (SOCKADDR*)&amp;sock_addr, sizeof(sock_addr));
    
    listen(s, SOMAXCONN);
    
    SOCKADDR c;
    int size = sizeof(c);
    
    SOCKET s1 = accept(s, &amp;c, &amp;size);
    std::cout &lt;&lt; "recieved\n";
    std::cout &lt;&lt; WSAGetLastError() &lt;&lt; '\n';
    

    }

    int main()
    {
    WSADATA WSAdata;
    WORD DLLVersion = MAKEWORD(2, 1);
    if (WSAStartup(DLLVersion, &WSAdata) != 0) {
    std::cout << "EROR WSAStartup\n";
    exit(1);
    }

    SOCKADDR_IN recv_TCP_addr;
    recv_TCP_addr.sin_addr.s_addr = INADDR_ANY;
    recv_TCP_addr.sin_port = 0;
    recv_TCP_addr.sin_family = AF_INET;
    int recv_TCP_size = sizeof(recv_TCP_addr);
    
    SOCKET recv_TCP_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    bind(recv_TCP_socket, (SOCKADDR*)&amp;recv_TCP_addr, recv_TCP_size);
    
    getsockname(recv_TCP_socket, (SOCKADDR*)&amp;recv_TCP_addr, &amp;recv_TCP_size);
    int recv_port = recv_TCP_addr.sin_port;
    
    std::thread th21(th2, recv_port);
    std::thread th11(th1, recv_port);
    th21.detach();
    th11.detach();
    
    std::this_thread::sleep_for(std::chrono::seconds(10));
    
    return 0;
    

    }

    What's the problem here, and is it possible to transfer the flow to a juket instead of a port?



  • In the first case, the number of the soket port that listens to the connection shall be transferred to the function. In terms int recv_port = recv_TCP_addr.sin_port; Total main The sket number has a web-based White order, but inside the function th1 Bite's order is turning. sock_addr.sin_port = htons(port); and the connection is taking place at another port.

    In the second case, the same problem occurs twice, but in the function th2 A third juket is being created, which tries to listen to the port itself and the connection is fixed.

    As they say, minus is a plus.



Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2