• 孙鑫 VC++深入详解第14课——TCP通信/UDP通信(转)


    原文转自 http://blog.csdn.net/supersonico/article/details/18900319

    一.用VC++来编写TCP 服务器/客户端的简单程序。

    注意事项:

    1.要加载ws2_32.lib链接库。

    项目->属性->弹出属性页->连接器->输入->附加依赖项

    2.要使用#include <WinSock2.h>头文件。

     

    实现步骤:

    1.服务器端:

    ①加载套接字库 (可以直接从MSDN上复制  WSAStartup)

    ②创建socket

    ③绑定socket(bind)

    ④将socket设置成监听状态(listen)

    ⑤等待客户端的访问(accept)

    ⑥接收客户端信息(recv)

    ⑦往客户端发送信息(send)

    ⑧关闭套接字(closesocket)

    ⑨清除套接字库(WSACleanup)

    #include <iostream>
    #include <WinSock2.h>
    #include <stdlib.h>
    using namespace std;
    
    void main()
    {
        //加载套接字  
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
    
        wVersionRequested = MAKEWORD(1, 1);
    
        err = WSAStartup(wVersionRequested, &wsaData);
        if (err != 0)
        {
            return;
        }
        if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
        {
            WSACleanup();
            return;
        }
    
        //创建用于监听的套接字
        SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
    
        SOCKADDR_IN addrSrv;
        addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
        addrSrv.sin_family = AF_INET;
        addrSrv.sin_port = htons(5656);
    
        //绑定套接字
        bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
        //将套接字设置为监听模式
        listen(sockSrv, 5);
    
        SOCKADDR_IN addrClient;
        int len = sizeof(SOCKADDR);
    
        while (1)
        {
            //等待客户的请求到来
            SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
            char sendBuf[100];
            sprintf_s(sendBuf, 100, "Welcome %s", inet_ntoa(addrClient.sin_addr));
    
            //发送数据  
            send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
            char recvBuf[100];
            //接受数据
            recv(sockConn, recvBuf, 100, 0);
            //打印接受的数据
            printf("%s
    ", recvBuf);
            //关闭套接字
            closesocket(sockConn);
        }
    }

    2.客户端:

    ①加载套接字库

    ②向服务器发送请求 connect

    ③接受服务器的信息 recv

    ④向服务器发送信息 send

    ⑤关闭套接字 closesocket

    ⑥清除套接字库 WSACleanup

    #include <iostream>  
    #include <WinSock2.h>  
    #include <stdlib.h>  
    using namespace std;
    
    void main()
    {
        //加载套接字  
        WORD wVersionRequested;
        WSADATA wsaData;
        int err;
    
        wVersionRequested = MAKEWORD(1, 1);
    
        err = WSAStartup(wVersionRequested, &wsaData);
        if (err != 0)
        {
            return;
        }
        if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
        {
            WSACleanup();
            return;
        }
    
        //创建套接字  
        SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
        //向服务器发送请求  
        SOCKADDR_IN sockAddrClient;
        sockAddrClient.sin_addr.S_un.S_addr = inet_addr("120.77.57.44");
        sockAddrClient.sin_family = AF_INET;
        sockAddrClient.sin_port = htons(5656);
    
        if (SOCKET_ERROR == connect(socketClient, (SOCKADDR*)&sockAddrClient, sizeof(SOCKADDR)))
        {
            closesocket(socketClient);
            WSACleanup();
            return;
        }
        //接受信息  
        char recvBuf[100];
        recv(socketClient, recvBuf, 100, 0);
        printf("%s
    ", recvBuf);
        //发送数据  
        send(socketClient, "This is lisi", strlen("This is lisi") + 1, 0);
        //关闭套接字  
        closesocket(socketClient);
        WSACleanup();
        cin.get();
        cin.get();
    }

     

    二.用VC++来编写UDP 服务器/客户端的简单程序。

    1.服务器端:

    ①加载套接字库(WSAstartup)

    ②创建socket

    ③绑定socket(bind)

    ④接受从客户端发来的信息(recvfrom)

    ⑤关闭套接字(closesocket)

    ⑥清空套接字库(WSAClearup)

    #include <iostream>  
    #include <stdlib.h>  
    #include <WinSock2.h>  
      
    using namespace std;  
      
    void main()  
    {  
        //加载套接字  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
      
        wVersionRequested = MAKEWORD(1,1);  
      
        err = WSAStartup(wVersionRequested,&wsaData);  
        if (err != 0)  
        {  
            return ;  
        }  
        if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)  
        {  
            WSACleanup();  
            return ;  
        }  
      
        //创建套接字  
        SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);  
      
        SOCKADDR_IN sockAddrSrv;  
        sockAddrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
        sockAddrSrv.sin_family = AF_INET;  
        sockAddrSrv.sin_port = htons(6000);  
        //绑定套接字  
        bind(sockSrv,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));  
      
        SOCKADDR_IN sockAddrClient;  
        int len = sizeof(SOCKADDR);  
        char recvBuf[100];  
        //接受客户端信息  
        recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&sockAddrClient,&len);  
        printf("%s
    ",recvBuf);  
      
        //关闭套接字  
        closesocket(sockSrv);  
        //清除套接字库  
        WSACleanup();  
        cin.get();  
        cin.get();  
    }  

     

    2.客户端:

    ①加载套接字库 (WSAstartup)

    ②创建socket

    ③发送数据(sendto)

    ④关闭套接字(closesocket)

    ⑤清空套接字库(WSAClearup)

    #include <iostream>  
    #include <stdlib.h>  
    #include <WinSock2.h>  
      
    using namespace std;  
      
    void main()  
    {  
        //加载套接字  
        WORD wVersionRequested;  
        WSADATA wsaData;  
        int err;  
      
        wVersionRequested = MAKEWORD(1,1);  
      
        err = WSAStartup(wVersionRequested,&wsaData);  
        if (err != 0)  
        {  
            return ;  
        }  
        if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)  
        {  
            WSACleanup();  
            return ;  
        }  
        //创建套接字  
        SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);  
          
        SOCKADDR_IN sockAddrSrv;  
        sockAddrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");  
        sockAddrSrv.sin_family = AF_INET;  
        sockAddrSrv.sin_port = htons(6000);  
      
        //char sendBuf[100];  
        sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&sockAddrSrv,sizeof(SOCKADDR));  
        closesocket(sockClient);  
        WSACleanup();  
        cin.get();  
        cin.get();  
    }

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    第十五天-linux系统文件权限详细讲解
    GB28181实现H265 H264摄像头 Web端无插件直播
    海康8700等联网网关通过GB28181接入LiveGBS流媒体服务实现web端无插件直播
    LiveNVR如何对接LiveQing云平台
    Onvif/RTSP视频流对接云平台-实现高性能云端直播及录像存储方案
    Onvif/RTSP摄像头实现按需直播-降低带宽流量使用
    LiveQing
    使用LiveGBS将GB28181流转成RTSP流上大屏
    实现国标GB28181流媒体服务解决方案
    LiveGBS GB28181流媒体服务-产品介绍及相关资源
  • 原文地址:https://www.cnblogs.com/happykoukou/p/7988115.html
Copyright © 2020-2023  润新知