Created
September 30, 2011 02:01
-
-
Save jdecaron/1252475 to your computer and use it in GitHub Desktop.
This file contains 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
#include <stdio.h> | |
#include <windows.h> | |
#define AF_INET 2 | |
#define SOCK_STREAM 1 | |
#define IPPROTO_TCP 6 | |
#define INVALID_SOCKET (SOCKET)(~0) | |
#define SOCKET_ERROR (-1) | |
#define DEFAULT_BUFLEN 512 | |
typedef struct WSAData { | |
WORD wVersion; | |
WORD wHighVersion; | |
char szDescription[256+1]; | |
char szSystemStatus[128+1]; | |
unsigned short iMaxSockets; | |
unsigned short iMaxUdpDg; | |
char FAR *lpVendorInfo; | |
} WSADATA, *LPWSADATA; | |
typedef struct sockaddr_in { | |
short sin_family; | |
unsigned short sin_port; | |
struct in_addr sin_addr; | |
char sin_zero[8]; | |
} sockaddr_in, *sockaddr_in; | |
typedef struct in_addr { | |
union { | |
struct { | |
unsigned char s_b1,s_b2,s_b3,s_b4; | |
} S_un_b; | |
struct { | |
unsigned short s_w1,s_w2; | |
} S_un_w; | |
unsigned long S_addr; | |
} S_un; | |
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR; | |
typedef int SOCKET; | |
SOCKET socket(int af, int type, int protocol); | |
int main(int argc, char **argv) | |
{ | |
//---------------------- | |
// Declare and initialize variables. | |
WSADATA wsaData; | |
int iResult; | |
SOCKET ConnectSocket = INVALID_SOCKET; | |
struct sockaddr_in clientService; | |
char *sendbuf = "this is a test"; | |
char recvbuf[DEFAULT_BUFLEN]; | |
int recvbuflen = DEFAULT_BUFLEN; | |
//---------------------- | |
// Initialize Winsock | |
iResult = WSAStartup(MAKEWORD(2,2), &wsaData); | |
if (iResult != NO_ERROR) { | |
printf("WSAStartup failed: %d\n", iResult); | |
return 1; | |
} | |
//---------------------- | |
// Create a SOCKET for connecting to server | |
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (ConnectSocket == INVALID_SOCKET) { | |
printf("Error at socket(): %ld\n", WSAGetLastError() ); | |
WSACleanup(); | |
return 1; | |
} | |
//---------------------- | |
// The sockaddr_in structure specifies the address family, | |
// IP address, and port of the server to be connected to. | |
clientService.sin_family = AF_INET; | |
clientService.sin_addr.S_addr = inet_addr( "127.0.0.1" ); | |
clientService.sin_port = htons( 27015 ); | |
//---------------------- | |
// Connect to server. | |
iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ); | |
if ( iResult == SOCKET_ERROR) { | |
closesocket (ConnectSocket); | |
printf("Unable to connect to server: %ld\n", WSAGetLastError()); | |
WSACleanup(); | |
return 1; | |
} | |
// Send an initial buffer | |
iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 ); | |
if (iResult == SOCKET_ERROR) { | |
printf("send failed: %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: %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: %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