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

winsock vc学习-01-简单client-ECHO

本帖最后由 uatlaosiji 于 2017-11-11 23:13 编辑

记录最基础的socket-client代码
直接复制vs进入不用设置。
// winsock_01.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(int argc,char **argv) {
      WSADATA wsaData;

      int iResult;

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


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

      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, DEFAULT_PORT, &hints, &result);
      if (iResult != 0) {
                printf("getaddrinfo failed: %d\n", iResult);
                WSACleanup();
                return 1;
      }

      SOCKET ConnectSocket = INVALID_SOCKET;


      // Attempt to connect to the first address returned by
      // the call to getaddrinfo
      ptr = result;

      // 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;
      }

      // Should really try the next address returned by getaddrinfo
      // if the connect call failed
      // But for this simple example we just free the resources
      // returned by getaddrinfo and print an error message

      freeaddrinfo(result);

      if (ConnectSocket == INVALID_SOCKET) {
                printf("Unable to connect to server!\n");
                WSACleanup();
                return 1;
      }

#define DEFAULT_BUFLEN 512

      int recvbuflen = DEFAULT_BUFLEN;

      char *sendbuf = "this is a test";
      char recvbuf;

      
      // 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 for sending since no more data will be sent
      // the client can still use the ConnectSocket for receiving data
      iResult = shutdown(ConnectSocket, SD_SEND);
      if (iResult == SOCKET_ERROR) {
                printf("shutdown failed: %d\n", WSAGetLastError());
                closesocket(ConnectSocket);
                WSACleanup();
                return 1;
      }

      // Receive data until the server 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);

      // shutdown the send half of 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;
      }

      // cleanup
      closesocket(ConnectSocket);
      WSACleanup();

      return 0;

}


慵懒丶L先森 发表于 2017-11-11 23:30

没有注释,不好的习惯
页: [1]
查看完整版本: winsock vc学习-01-简单client-ECHO