zoukankan      html  css  js  c++  java
  • C++基于TCP和UDP的socket通信

    以下是关于socket编程的一个非常经典的例子:

    服务端:

    #include <stdio.h>
    #include <Winsock2.h> //windows socket的头文件
    
    #pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件
    
    void main()
    {
        //初始化winsocket
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
    
        wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节
    
        err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
        if ( err != 0 )
        {
            return;
        }
    
        if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容        
        {
            WSACleanup( );
            return;
        }
    
        SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP
    
        SOCKADDR_IN addrSrv; 
        addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);    //htonl用来将主机字节顺序转换为网络字节顺序(to network long)
        //INADDR_ANY就是指定地址为0.0.0.0的地址,
        //表示不确定地址,或“任意地址”。”
        addrSrv.sin_family=AF_INET; 
        addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short)
    
        bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket
    
        listen(sockSrv,5);//socket监听,准备接受连接请求。
    
        SOCKADDR_IN addrClient;
        int len=sizeof(SOCKADDR);
    
        while(1)
        {
            SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接
    
            char sendBuf[50];
            sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针
            send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    
            char recvBuf[50];
            recv(sockConn,recvBuf,50,0);
            printf("%s
    ",recvBuf);
    
            closesocket(sockConn);
            Sleep(2000);//2000毫秒
        }
        WSACleanup();
    }

    客户端:

    #include <stdio.h>
    #include <Winsock2.h>
    
    #pragma comment( lib, "ws2_32.lib" ) 
    
    
    void main()
    {
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
    
        wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节
    
        err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
        if ( err != 0 )
        {
            return;
        }
    
        if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容        
        {
            WSACleanup( );
            return;
        }
        for(int index=0;;index++)
        {
            SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
    
            SOCKADDR_IN addrClt;//需要包含服务端IP信息
            addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");// inet_addr将IP地址从点数格式转换成网络字节格式整型。
            addrClt.sin_family=AF_INET; 
            addrClt.sin_port=htons(4000);
    
            connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求
            char recvBuf[50];
            recv(sockClient,recvBuf,50,0);
            printf("my reply is : %s
    ",recvBuf);
    
            char sendBuf[50];
            sprintf(sendBuf,"%3d,",index);
            strcat(sendBuf,"server node of: yaopeng");
            send(sockClient,sendBuf,strlen(sendBuf)+1,0);
    
            closesocket(sockClient);
            Sleep(2000);
        }
        WSACleanup();
    }
  • 相关阅读:
    阿里云云效技术专家分享:云原生开发、调测及可靠发布解决方案
    对话李飞飞,揭秘国际体育赛事风“云”背后的黑科技
    时序数据库永远的难关 — 时间线膨胀(高基数 Cardinality)问题的解决方案
    当Java遇上机密计算,又一段奇幻之旅开始了!
    内核热补丁,真的安全么?
    在 Dubbo3.0 上服务治理的实践
    CCF-201509-3-生成模板系统
    WPF CommandParameter的使用
    UWP App Data存储和获取
    在WPF中的ItemsControl中使用事件和命令(Using events and Commands within ItemsControl in WPF)
  • 原文地址:https://www.cnblogs.com/lujin49/p/4851164.html
Copyright © 2011-2022 走看看