Created
June 10, 2016 20:23
-
-
Save mescarra/7c5fe51bfde4d5a45e2eaa8f296e4775 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define WIN32_LEAN_AND_MEAN | |
#define _WIN32_WINNT 0x501 | |
#include <windows.h> | |
#include <winsock2.h> | |
#include <ws2tcpip.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
// 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 256 | |
int __cdecl main(int argc, char **argv) | |
{ | |
WSADATA wsaData; | |
SOCKET ConnectSocket = INVALID_SOCKET; | |
struct addrinfo *result = NULL, | |
*ptr = NULL, | |
hints; | |
//char sendbuf[DEFAULT_BUFLEN]; | |
char recvbuf[DEFAULT_BUFLEN]; | |
int iResult; | |
int recvbuflen = DEFAULT_BUFLEN; | |
// Validate the parameters | |
if (argc != 4) { | |
printf("usage: %s server-name port-number command\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_INET; | |
hints.ai_socktype = SOCK_STREAM; | |
// Resolve the server address and port | |
iResult = getaddrinfo(argv[1], argv[2], &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 command | |
iResult = send( ConnectSocket, argv[3], (int)strlen(argv[3]), 0 ); | |
if (iResult == SOCKET_ERROR) { | |
printf("send failed with error: %d\n", WSAGetLastError()); | |
closesocket(ConnectSocket); | |
WSACleanup(); | |
return 1; | |
} | |
// 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 | |
memset(recvbuf, 0, DEFAULT_BUFLEN); | |
do { | |
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); | |
if ( iResult > 0 ) | |
printf("%s\n", recvbuf); | |
else if ( iResult < 0 ) {} | |
printf("recv failed with error: %d\n", WSAGetLastError()); | |
} while( iResult > 0 ); | |
// cleanup | |
closesocket(ConnectSocket); | |
WSACleanup(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment