在windows下用C语言写socket通讯实例

原文: 在windows下用C语言写socket通讯实例

From:Microsoft Dev Center


#undef UNICODE



#define WIN32_LEAN_AND_MEAN



#include <windows.h>

#include <winsock2.h>

#include <ws2tcpip.h>

#include <stdlib.h>

#include <stdio.h>



// 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 __cdecl main(void) 

{

    WSADATA wsaData;

    int iResult;



    SOCKET ListenSocket = INVALID_SOCKET;

    SOCKET ClientSocket = INVALID_SOCKET;



    struct addrinfo *result = NULL;

    struct addrinfo hints;



    int iSendResult;

    char recvbuf[DEFAULT_BUFLEN];

    int recvbuflen = DEFAULT_BUFLEN;

    printf("from server:\n");

    // 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 connecting to server

    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);

    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

    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);



    // 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();



    return 0;

}

 

#define WIN32_LEAN_AND_MEAN



#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 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

	//The WSAStartup function is called to initiate use of WS2_32.dll.

    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("localhost", 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;

}



你可能感兴趣的:(windows)