zoukankan      html  css  js  c++  java
  • C++Socket套接字网络通信TCP协议

    本来打算去虚拟机的server服务器上演示,但是没有设置明白虚拟机和本机的内网IP地址问题,所以就在本机上演示了。

    客户机

    #pragma comment(lib, "ws2_32.lib")
    
    #include <WinSock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    //定义程序中使用的常量      
    #define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址      
    #define PORT           5150         //服务端程序端口     
    #define MSGSIZE        1024         //收发缓冲区的大小         
    
    int main()
    {
        WSADATA wsaData;
        //连接所用套节字      
        SOCKET sClient;
        //保存远程服务器的地址信息      
        SOCKADDR_IN server;
        //收发缓冲区      
        char szMessage[MSGSIZE];
        //成功接收字节的个数      
        int ret;
    
        //加载初始化  
        WSAStartup(0x0202, &wsaData);
    
        //创建客户端套接字      
        sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP协议     
        //SOCK_STREAM, IPPROTO_TCP具体指明使用TCP协议      
        // 指明远程服务器的地址信息(端口号、IP地址等)      
        memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0   
        server.sin_family = PF_INET; //使用INET协议   
        server.sin_port = htons(PORT); //端口,本机字节转换成网络字节   
        server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //服务端的IP地址   
        //结构SOCKADDR_IN的sin_addr字段用于保存IP地址,sin_addr字段也是一个结构体,sin_addr.s_addr用于最终保存IP地址      
        //inet_addr()用于将 形如的"127.0.0.1"字符串转换为IP地址格式      
        //连到刚才指明的服务器上      
        connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN)); //连接后可以用sClient来使用这个连接      
        //server保存了远程服务器的地址信息      
        while (TRUE) {
            printf("Send:");
            //从键盘输入      
            gets_s(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage      
            // 发送数据      
            send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度 
        }
    
        // 释放连接和进行结束工作      
        closesocket(sClient);
        WSACleanup();
        return 0;
    }

    服务器

    #pragma comment(lib, "ws2_32.lib")
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <WinSock2.h> 
    
    #define PORT           5150    //端口(一共六万多个)
    #define MSGSIZE        1024    //接收的数据
     
    
    int main()
    {
        //服务端
    
        //初始化windows套接字网络库
        WSADATA wsaData;
        SOCKET sListen;//服务端套接字
        SOCKET sClient;//客户端套接字
        SOCKADDR_IN local;//服务端地址
        SOCKADDR_IN client;//客户端地址
        char szMessage[MSGSIZE];
        int ret;
        int iaddrSize = sizeof(SOCKADDR_IN);//客户端地址的长度
        WSAStartup(0x0202, &wsaData);//连接
    
        //创建一个服务端的套接字
        sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//TCP协议
    
        //绑定,将套接字和服务端地址做绑定
        local.sin_family = AF_INET;//协议,INET协议
        local.sin_port = htons(PORT);//端口,本机字节转变成网络字节
        local.sin_addr.s_addr = htonl(INADDR_ANY);//地址,本机字节转变成网络字节,任何一个客户端IP都可以连接上来
        bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));//做绑定
    
        //开始监听
        //最多有1个客户端连接,超了就在队列排队等待
        listen(sListen, 1);
    
        //接收客户端的连接
        sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize);
        printf("Accepted client:%s:%d
    ", inet_ntoa(client.sin_addr),
            ntohs(client.sin_port));
    
        while(TRUE) 
        {
            ret = recv(sClient, szMessage, MSGSIZE, 0);
            szMessage[ret] = '';
            printf("Received [%d bytes]: '%s'
    ", ret, szMessage);
        }
    
        return 0;
    }

  • 相关阅读:
    python学习之集合
    fastjson SerializerFeature详细使用教程(特别注意:重复引用和循环引用问题)
    Elasticsearch 常见问题汇总及解决姿势(后续会持续更新)
    Elasticsearch常用操作命令——增删改查、集群维护
    Python 常用包、模块定义详解
    Elasticsearch Python脚本查询常用操作
    右键菜单中新建EXCEL丢失解决办法
    解决Spring Boot 使用RedisTemplate 存储键值出现乱码
    深入理解xhr responseType blob arrayBuffer document text json使用
    Android内存溢出解决方案总结
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/14022347.html
Copyright © 2011-2022 走看看