• select模式学习(二)之:客户端


    #include "stdafx.h"

    ////////////////////////////////////////////
    //
    //  TCP Client  非阻塞模式设定
    //
    ////////////////////////////////////////////

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

    #include <WinSock2.h>

    #define CONNECT_IP        "127.0.0.1"
    #define CONNECT_PORT      1207
    #define DEFAULT_BUFF_LEN  256
    int _tmain(int argc, _TCHAR* argv[])
     {
     WSAData       wsData;
     SOCKET        sServer;
     SOCKADDR_IN   addrServer;
     SOCKADDR_IN   addrLocal;
     char          sendBuff[DEFAULT_BUFF_LEN]={0};
     char          recvBuff[DEFAULT_BUFF_LEN]={0};
     int           nError;
     printf(">>>>>TCP 客户端启动<<<<<<\n");
     WSAStartup( MAKEWORD(2,2), &wsData );
     printf("-创建客户端用SOCKET\n");
     sServer = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
     if( sServer == INVALID_SOCKET )
      {
      printf("!!! socket failed: %d\n", WSAGetLastError());
      WSACleanup();
      return -1;
      }
     addrServer.sin_family = AF_INET;
     addrServer.sin_addr.S_un.S_addr = inet_addr( CONNECT_IP );
     addrServer.sin_port = htons(CONNECT_PORT);
     printf("-设定服务器地址信息: %s:%d\n",inet_ntoa(addrServer.sin_addr), ntohs(addrServer.sin_port));

     //设定本地用地址和端口
     //addrLocal.sin_family = AF_INET;
     //addrLocal.sin_addr.S_un.S_addr = inet_addr( CONNECT_IP );
     //addrLocal.sin_port = htons( 2701 );
     //printf("-绑定本地用地址和端口: %s:%d\n", inet_ntoa(addrLocal.sin_addr), ntohs(addrLocal.sin_port));
     ////nError = bind( sServer, (const sockaddr*)&addrLocal, sizeof(addrLocal) );
     //if( nError == SOCKET_ERROR )
     // {
     // printf("!!! bind failed: %d\n", WSAGetLastError());
     // WSACleanup();
     // return -1;
     // }

     printf("-连接指定服务器\n");
     nError = connect( sServer, (const sockaddr*)&addrServer, sizeof(addrServer) );
     if( nError == SOCKET_ERROR )
      {
      printf("!!! connect failed: %d\n", WSAGetLastError());
      closesocket( sServer );
      WSACleanup();
      return -1;
      }
     ///////////////////////////////////
     //  客户端 SOCKET为非阻塞模式
     //
     ///////////////////////////////////
     DWORD nMode = 1;
     nError = ioctlsocket( sServer, FIONBIO, &nMode );
     if( nError == SOCKET_ERROR )
      {
      printf("!!! ioctlsocket failed: %d\n", WSAGetLastError());
      closesocket( sServer );
      WSACleanup();
      return -1;
      }
     printf("-SOCKET模式设定: %s\n", (nMode==0?"阻塞模式设定":"非阻塞模式设定"));

     printf("-开始准备送信受信\n");
     int nInputLen = 0;
     int nIndex    = 0;
     int nLeft     = 0;
     fd_set  fdRead;
     fd_set  fdWrite;
     timeval tv={10,0};
     while(true)
      {
      FD_ZERO( &fdRead );
      FD_ZERO( &fdWrite );
      FD_SET( sServer, &fdRead );
      FD_SET( sServer, &fdWrite );
      nError = select( 0, &fdRead, &fdWrite, NULL, &tv );
      if( nError == 0 )
       {
       printf("!!! select time out\n");
       continue;
       }
      else if( nError < 0 )
       {
       printf("!!! select failed: %d\n", WSAGetLastError());
       break;
       }


      //发现SOCKET可读/可写
      if( FD_ISSET( sServer, &fdRead) )
       {
       memset( recvBuff, 0, sizeof(recvBuff) );
       nError = recv( sServer, recvBuff, sizeof(recvBuff)-1, 0 );
       ;;;;;if( nError == SOCKET_ERROR )
        {
        printf("!!! recv failed: %d\n", WSAGetLastError());
        break;
        }
       else if( nError == 0 )
        {
        printf("-Server Has Closed.\n");
        break;
        }
       recvBuff[nError] = '\0';
       printf("-Received: %s\n\n", recvBuff);
       }
      if( FD_ISSET(sServer, &fdWrite) )
       {
       printf("Input Message You Want to Send( Quit ):\n");
       fflush( stdin );
       memset( sendBuff, 0, sizeof(sendBuff) );
       fgets( sendBuff, sizeof(sendBuff)-1, stdin );
       nInputLen = strlen( sendBuff );
       sendBuff[nInputLen-1] = '\0';//去掉回车符
       --nInputLen;
       nIndex = 0;
       nLeft  = nInputLen;
       if(strcmp(sendBuff, "Quit")==0)
        {
        break;
        }
       //将输入的数据发送过去
       while( nLeft > 0)
        {
        nError = send( sServer, &sendBuff[nIndex], nLeft, 0 );
        ;;;;if( nError == SOCKET_ERROR )
         {
         printf("!!! send failed: %d\n",WSAGetLastError());
         closesocket( sServer );
         WSACleanup();
         return -1;
         }
        else if( nError == 0 )
         {
         printf("-Send OK.\n");
         break;
         }

        nLeft  -= nError;
        nIndex += nError;
        }
       printf("-Has send: %s\n",sendBuff);
       }
      }//while(true)

     printf("-关闭SOCKET\n");
     closesocket(sServer);
     WSACleanup();
     return 0;
     }

  • 相关阅读:
    外键的创建
    MySQL (1366, "Incorrect string value: '\xF0\x9F\x8E\xAC\xE5\x89...' for column 'description' at row 1")
    python 获取文件路径
    ModuleNotFoundError: No module named 'Crypto'
    Django---错误
    CentOS7系统ifconfig无法使用的解决方法
    NACOS集群搭建遇到的问题
    Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理
    CentOS7 yum方式安装MySQL5.7
    MySQL数据库的全局锁和表锁
  • 原文地址:https://www.cnblogs.com/yuanxingdefan/p/2868975.html
Copyright © 2020-2023  润新知