| Line 15: |
Line 15: |
| | </pre> | | </pre> |
| | | | |
| − | == Client code example ==
| |
| − | <pre>
| |
| − | #include <winsock2.h>
| |
| − | #include <ws2tcpip.h>
| |
| − | #include <stdlib.h>
| |
| − | #include <stdio.h>
| |
| − |
| |
| − | // Need to link with Ws2_32.lib, Mswsock.lib, and 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;
| |
| − | 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: %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: %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("Error at socket(): %ld\n", WSAGetLastError());
| |
| − | freeaddrinfo(result);
| |
| − | 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: %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;
| |
| − | }
| |
| − | </pre>
| |
| | ==See Also== | | ==See Also== |
| | :[http://gcc.gnu.org/ Free compiler] | | :[http://gcc.gnu.org/ Free compiler] |