bool Bind(ConnectionWrapper *Connection, std::string LocalAddress, int32_t Port) { #ifdef _WIN32 InitializeWinsock(); #endif if (Port < 0) return false; // Create a new socket. if (Connection->Handle.Datagram.Socket == nullptr) Connection->Handle.Datagram.Socket = (void *)socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (Connection->Handle.Datagram.Socket == nullptr) return false; // Prepare an address structure. sockaddr_in AddressInfo; AddressInfo.sin_family = AF_INET; AddressInfo.sin_port = htons(Port); if (LocalAddress.size() > 1) InetPton(AF_INET, LocalAddress.c_str(), &AddressInfo.sin_addr); else AddressInfo.sin_addr.S_un.S_addr = INADDR_ANY; // Bind to the port. return bind((SOCKET)Connection->Handle.Datagram.Socket, (sockaddr *)&AddressInfo, sizeof(AddressInfo)) != SOCKET_ERROR; }
int DITGsend(char *sender, char *message) { #ifdef WIN32 if (InitializeWinsock(MAKEWORD(1,1)) != 1) { fprintf(stderr, "WSAStartup() failed"); exit(1); } #endif struct addrinfo* locale = 0; freeaddrinfo(locale); getaddrinfo("0.0.0.0", NULL, NULL, &locale); socket_r = socket(locale->ai_family, SOCK_DGRAM, 0); if (socket_r < 0) printf("error into create a socket - DITGSend function \n"); #ifdef UNIX int flags; flags = fcntl(socket_r, F_GETFL, 0); fcntl(socket_r, F_SETFL, flags | O_NONBLOCK); #endif #ifdef WIN32 unsigned long i = 1; ioctlsocket(socket_r, FIONBIO, &i); #endif struct sockaddr_in Sender; struct hostent *host; Sender.sin_family = AF_INET; if (!(host = gethostbyname(sender))) { cerr << endl << "DITGsend: Invalid destination address" << endl; return -1; } memcpy((char *) &Sender.sin_addr, host->h_addr, host->h_length); Sender.sin_port = htons(DEFAULT_PORT_SENDER_MANAGER); if (sendto(socket_r, message, strlen(message), 0, (struct sockaddr *) &Sender, sizeof(Sender)) != (int) strlen(message)) return -1; return 0; }
int wmain(int argc, wchar_t* argv[]) { int result = 0; HRESULT hr = S_OK; if (FAILED(InitializeWinsock())) { return 1; } if (argc < 3) { PrintHelp(argv[0]); } else if (argc >= 2 && _wcsicmp(argv[1], L"tcp") == 0 && _wcsicmp(argv[2], L"server") == 0) { result = DoTcpServer(); } else if (_wcsicmp(argv[1], L"tcp") == 0 && _wcsicmp(argv[2], L"client") == 0) { result = DoTcpClient(); } else if (_wcsicmp(argv[1], L"udp") == 0 && _wcsicmp(argv[2], L"receive") == 0) { result = DoUdpReceive(); } else if (_wcsicmp(argv[1], L"udp") == 0 && _wcsicmp(argv[2], L"send") == 0) { result = DoUdpSend(); } else if (_wcsicmp(argv[1], L"dns") == 0) { hr = DoDns(argv[2]); } else { PrintHelp(argv[0]); } // Clean. WSACleanup(); if (FAILED(hr)) { return hr; } return result; }
bool socketTransfertClient::Connect(char *ipaddress, int port) { if (!InitializeWinsock()) return false; struct sockaddr_in ipv4addr; ipv4addr.sin_family = AF_INET; ipv4addr.sin_port = htons(port); inet_ptonx(AF_INET, ipaddress, &ipv4addr.sin_addr); if (connect(m_clientSocket, reinterpret_cast<struct sockaddr*>(&ipv4addr), sizeof(ipv4addr)) != 0) { WSACleanup(); return false; } m_isConnected = true; u_long blockingmode = 1; ioctlsocket(m_clientSocket, FIONBIO, &blockingmode); return true; }
// Create a connection. bool Connect(ConnectionWrapper *Connection, std::string Hostname, int32_t Port) { #ifdef _WIN32 InitializeWinsock(); #endif // Resolve the hostname. auto AddressInfo = ResolveHostname(Connection->Type == eConnection::STREAMED, Hostname, Port); if (AddressInfo == nullptr) return false; // Disconnect from the previous connection if reused. if (Connection->Handle.Streamed.Connected) { Shutdown(Connection); Connection->Handle.Streamed.Connected = false; } // Create a new socket. if (Connection->Handle.Streamed.Socket == nullptr) Connection->Handle.Streamed.Socket = (void *)socket(AddressInfo->ai_family, AddressInfo->ai_socktype, IPPROTO_TCP); if (Connection->Handle.Streamed.Socket == nullptr) { freeaddrinfo(AddressInfo); return false; } // Set non-blocking mode on the socket. u_long Nonblocking = 1; #ifdef _WIN32 ioctlsocket((SOCKET)Connection->Handle.Streamed.Socket, FIONBIO, &Nonblocking); #else ioctl(Connection->Handle.Streamed.Socket, FIONBIO, &Nonblocking); #endif // Connect to the address. if (connect((SOCKET)Connection->Handle.Streamed.Socket, AddressInfo->ai_addr, AddressInfo->ai_addrlen) != 0) { #if _WIN32 if (WSAGetLastError() == WSAEWOULDBLOCK) #else if (errno == EINPROGRESS) #endif { // Poll until the connection completes or times out. auto Starttime = std::chrono::steady_clock::now(); timeval Timeout; fd_set WFDs; // Set timeout to 5 sec. Timeout.tv_sec = 5; Timeout.tv_usec = 0; // Set the file descriptors. FD_ZERO(&WFDs); FD_SET((SOCKET)Connection->Handle.Streamed.Socket, &WFDs); // Poll the connection. if (select((int)Connection->Handle.Streamed.Socket + 1, NULL, &WFDs, NULL, &Timeout) > 0 && FD_ISSET((SOCKET)Connection->Handle.Streamed.Socket, &WFDs)) { freeaddrinfo(AddressInfo); return true; } } else { freeaddrinfo(AddressInfo); return false; } } return true; }