Winsock使用之客户端和服务器完整代码

xiaoxiao2021-02-28  31

本节包含 TCP/IP 客户端和服务器应用程序的完整源代码︰

完整客户端源码

[cpp]  view plain  copy #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      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(argv[1], 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();      system("pause");      return 0;  }  

完整服务器代码

[cpp]  view plain  copy #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;           // 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();      system("pause");        return 0;  }  

1.客户端应用程序启动之前就应该开始服务器应用程序。2.若要执行服务器,将完整的服务器源代码编译和运行的可执行文件。服务器应用程序侦听 TCP 端口 27015 为客户端连接。一旦一个客户端连接,服务器从客户端和回声(发送) 收到回客户端的数据接收数据。当客户端关闭了连接时,服务器客户端套接字关闭,关闭的套接字,并退出。3.执行客户端,完整的客户端源代码编译和运行的可执行文件。客户端应用程序需要该名称的计算机或 IP 地址的计算机在运行服务器应用程序作为命令行参数执行时传递客户端。如果客户端和服务器在样本计算机上执行的可以如下启动客户端︰     client localhost4.客户端试图连接到服务器上的 TCP 端口 27015。一旦客户端连接,客户端向服务器发送数据和接收从服务器返回的任何数据发送。客户端关闭套接字,然后退出。

转载请注明原文地址: https://www.6miu.com/read-2800307.html

最新回复(0)