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, &c, &size); std::cout << "recieved\n"; std::cout << WSAGetLastError() << '\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*)&recv_TCP_addr, recv_TCP_size); getsockname(recv_TCP_socket, (SOCKADDR*)&recv_TCP_addr, &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), &sock_addr.sin_addr.s_addr); sock_addr.sin_port = htons(port); sock_addr.sin_family = AF_INET; bind(s, (SOCKADDR*)&sock_addr, sizeof(sock_addr)); listen(s, SOMAXCONN); SOCKADDR c; int size = sizeof(c); SOCKET s1 = accept(s, &c, &size); std::cout << "recieved\n"; std::cout << WSAGetLastError() << '\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*)&recv_TCP_addr, recv_TCP_size); getsockname(recv_TCP_socket, (SOCKADDR*)&recv_TCP_addr, &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;
Totalmain
The sket number has a web-based White order, but inside the functionth1
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.