//#define WIN32_LEAN_AND_MEAN // //#include //#include //#include //#include //#include // //// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib //#pragma comment (lib, "Ws2_32.lib") //#pragma comment (lib, "Mswsock.lib") //#pragma comment (lib, "AdvApi32.lib") // //#define DEFAULT_BUFLEN 512 //#define DEFAULT_PORT "27015" // //int __cdecl main(int argc, char** argv) //{ // WSADATA wsaData; // SOCKET ConnectSocket = INVALID_SOCKET; // struct addrinfo* result = NULL, // * ptr = NULL, // hints; // const char* sendbuf = "this is a test"; // char recvbuf[DEFAULT_BUFLEN]; // int iResult; // int recvbuflen = DEFAULT_BUFLEN; // // // Validate the parameters // if (argc != 2) { // printf("usage: %s server-name\n", argv[0]); // return 1; // } // // // Initialize Winsock // iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); // if (iResult != 0) { // printf("WSAStartup failed with error: %d\n", iResult); // return 1; // } // // ZeroMemory(&hints, sizeof(hints)); // hints.ai_family = AF_UNSPEC; // hints.ai_socktype = SOCK_STREAM; // hints.ai_protocol = IPPROTO_TCP; // // // Resolve the server address and port // iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); // if (iResult != 0) { // printf("getaddrinfo failed with error: %d\n", iResult); // WSACleanup(); // // return 1; // } // // // Attempt to connect to an address until one succeeds // for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { // // // Create a SOCKET for connecting to server // ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); // // if (ConnectSocket == INVALID_SOCKET) { // printf("socket failed with error: %ld\n", WSAGetLastError()); // WSACleanup(); // return 1; // } // // // Connect to server. // iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); // // if (iResult == SOCKET_ERROR) { // closesocket(ConnectSocket); // ConnectSocket = INVALID_SOCKET; // continue; // } // // break; // } // // freeaddrinfo(result); // // if (ConnectSocket == INVALID_SOCKET) { // printf("Unable to connect to server!\n"); // WSACleanup(); // // return 1; // } // // // Send an initial buffer // iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0); // if (iResult == SOCKET_ERROR) { // printf("send failed with error: %d\n", WSAGetLastError()); // closesocket(ConnectSocket); // WSACleanup(); // // return 1; // } // // printf("Bytes Sent: %ld\n", iResult); // // // shutdown the connection since no more data will be sent // iResult = shutdown(ConnectSocket, SD_SEND); // if (iResult == SOCKET_ERROR) { // printf("shutdown failed with error: %d\n", WSAGetLastError()); // closesocket(ConnectSocket); // WSACleanup(); // // return 1; // } // // // Receive until the peer closes the connection // do { // iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); // // if (iResult > 0) // printf("Bytes received: %d\n", iResult); // else if (iResult == 0) // printf("Connection closed\n"); // else // printf("recv failed with error: %d\n", WSAGetLastError()); // // } while (iResult > 0); // // // cleanup // closesocket(ConnectSocket); // WSACleanup(); // // return 0; //} #undef UNICODE #define WIN32_LEAN_AND_MEAN #include #include #include #include #include // Need to link with Ws2_32.lib #pragma comment (lib, "Ws2_32.lib") // #pragma comment (lib, "Mswsock.lib") #define DEFAULT_BUFLEN 512 #define DEFAULT_PORT "27015" int receiv(iResult, ClientSocket, recvbuf, recvbuflen) { int iSendResult; do { iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); if (iResult > 0) { printf("Bytes received: %d\n", iResult); // Echo the buffer back to the sender iSendResult = send(ClientSocket, recvbuf, iResult, 0); if (iSendResult == SOCKET_ERROR) { printf("send failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } printf("Bytes sent: %d\n", iSendResult); } else if (iResult == 0) printf("Connection closing...\n"); else { printf("recv failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } } while (iResult > 0); } int __cdecl main(void) { WSADATA wsaData; int iResult; SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET; struct addrinfo* result = NULL; struct addrinfo hints; char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { printf("WSAStartup failed with error: %d\n", iResult); return 1; } ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the server address and port iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed with error: %d\n", iResult); WSACleanup(); return 1; } // Create a SOCKET for the server to listen for client connections. ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed with error: %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; } // Setup the TCP listening socket iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); if (iResult == SOCKET_ERROR) { printf("bind failed with error: %d\n", WSAGetLastError()); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); iResult = listen(ListenSocket, SOMAXCONN); if (iResult == SOCKET_ERROR) { printf("listen failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } // Accept a client socket ClientSocket = accept(ListenSocket, NULL, NULL); HANDLE hThread; DWORD threadID; hThread = CreateThread(NULL, 0, receiv(iResult, ClientSocket, recvbuf, recvbuflen), NULL, 0, &threadID); if (ClientSocket == INVALID_SOCKET) { printf("accept failed with error: %d\n", WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return 1; } // No longer need server socket // closesocket(ListenSocket); // Receive until the peer shuts down the connection // shutdown the connection since we're done iResult = shutdown(ClientSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed with error: %d\n", WSAGetLastError()); closesocket(ClientSocket); WSACleanup(); return 1; } // cleanup closesocket(ClientSocket); WSACleanup(); CloseHandle(hThread); return 0; }