zoukankan      html  css  js  c++  java
  • vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板

    VC和服务器建立TCP连接不像VB的winsock那样两三行代码就能搞定。虽然VC得MFC类库中也有CSocket、CAsyncSocket这样的类,但是这些类的毛病太多,还是返璞归真用socket api来的灵活。

    每次用到都得查一遍流程,这次写个几乎通用的模板,以备以后用。

    注:
    1.因为socket只能传入IP地址,所以要想连接还得先解析域名,以下包括把域名解析为IP的代码。
    2.以下代码为阻塞模式(并非异步模式)所以在主线程中使用很可能阻塞程序运行,最好是新开个线程使用。

     

       int retVal;
       WORD wVersionRequested;
       WSADATA wsaData;
       int err;
     
    //构建保存版本号的WORD类型变量
       wVersionRequested = MAKEWORD( 1, 1 );
     
    //加载套接字库
       err = WSAStartup( wVersionRequested, &wsaData );
       if ( err != 0 ) {
        return 0;
       }
     
    //检查加载的套接字库版本和请求的是否一致
       if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
        WSACleanup( );
        return 0;
       }

       //定义DWORD类型变量dwIP 该变量保存解析得到的IP地址(32位整数 并非点分十进制字符串)
    DWORD dwIP = 0;
       //域名解析
       HOSTENT* pHS = gethostbyname(strdomain);
       if(   pHS   !=   NULL)  
       {  
        in_addr addr;  
        CopyMemory(&addr.S_un.S_addr, pHS->h_addr_list[0], pHS->h_length);  
        dwIP = addr.S_un.S_addr;  
       }
       else
       {
        WSACleanup();
        return 0;
       }

       //创建套接字,第一个参数是地址族 TCP/IP下始终为AF_INET,第二个参数表示流式套接字,第三个参数指定协议,0表示系统自选协议 而对于流式套接字 系统的自选协议就是TCP协议
    SOCKET sckTongJi = socket(AF_INET, SOCK_STREAM, 0);

       //定义地址结构体 并初始化
    SOCKADDR_IN addrSvr;
       addrSvr.sin_family = AF_INET;
       addrSvr.sin_addr.S_un.S_addr = dwIP; //inet_addr("127.0.0.1"); //字符串转十六进制IP用inet_addr反之用inet_ntoa
       addrSvr.sin_port = htons(80); //使用网络字序 不同处理器高位在前 还是 低位在前不相同 在这儿统一

       retVal = connect(sckTongJi, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR_IN));
       if (retVal)
       {
        //AfxMessageBox("connect error!");
        WSACleanup();
        return 0;
       }
       char strbuff[4096];

       memset(strbuff, 0, sizeof(strbuff));
       send(sckTongJi, strout, strout.GetLength(), 0);
       recv(sckTongJi, strbuff, 4096, 0);
       closesocket(sckTongJi);
       WSACleanup();

  • 相关阅读:
    【秒懂Java】【01_初识Java】04_学习资料
    【秒懂Java】【01_初识Java】03_Java简介
    【秒懂Java】【01_初识Java】02_软件开发
    【秒懂Java】【01_初识Java】01_编程语言
    Apriori算法
    Java并发编程--ThreadLocal内存泄漏原因
    Java并发编程--锁
    Java并发编程--wait/notify/notifyAll 方法的使用
    Java并发编程--线程的生命周期
    Java虚拟机--垃圾收集器--G1收集器
  • 原文地址:https://www.cnblogs.com/huhu0013/p/1894098.html
Copyright © 2011-2022 走看看