uatlaosiji 发表于 2017-11-11 23:12

winsock vc学习-02-简单server-ECHO

server和client在一起构建echo通信。
// winsock_02_server.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>



#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_PORT "27015"

int main()
{
        WSADATA wsaData;

        int iResult;

        // Initialize Winsock
        iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
        if (iResult != 0) {
                printf("WSAStartup failed: %d\n", iResult);
                return 1;
        }

        //#define DEFAULT_PORT "27015"

        struct addrinfo *result = NULL, *ptr = NULL, hints;

        ZeroMemory(&hints, sizeof(hints));
        //ipv6
        //hints.ai_family = AF_INET;
        hints.ai_family = AF_INET6;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_flags = AI_PASSIVE;

        // Resolve the local address and port to be used by the server
        iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
        if (iResult != 0) {
                printf("getaddrinfo failed: %d\n", iResult);
                WSACleanup();
                return 1;
        }

        SOCKET ListenSocket = INVALID_SOCKET;

        // 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("Error at socket(): %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;
        }

        if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
                printf("Listen failed with error: %ld\n", WSAGetLastError());
                closesocket(ListenSocket);
                WSACleanup();
                return 1;
        }


        SOCKET ClientSocket;

        ClientSocket = INVALID_SOCKET;

        // Accept a client socket
        ClientSocket = accept(ListenSocket, NULL, NULL);
        if (ClientSocket == INVALID_SOCKET) {
                printf("accept failed: %d\n", WSAGetLastError());
                closesocket(ListenSocket);
                WSACleanup();
                return 1;
        }


#define DEFAULT_BUFLEN 512

        char recvbuf;
        intiSendResult;
        int recvbuflen = DEFAULT_BUFLEN;

        // 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: %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: %d\n", WSAGetLastError());
                        closesocket(ClientSocket);
                        WSACleanup();
                        return 1;
                }

        } while (iResult > 0);


        // shutdown the send half of the connection since no more data will be sent
        iResult = shutdown(ClientSocket, SD_SEND);
        if (iResult == SOCKET_ERROR) {
                printf("shutdown failed: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
        }

        // cleanup
        closesocket(ClientSocket);
        WSACleanup();

        return 0;
}

页: [1]
查看完整版本: winsock vc学习-02-简单server-ECHO