• Windows的socket编程


    ################服务端

    1.准备工作导入头文件

    1 #include<WinSock2.h>
    2 #pragma comment(lib, "ws2_32.lib")
    View Code

    2.确定版本信息

       MSAStartup :异步套接字的启动命令 .  第一个参数是版本请求,高阶字节是修订版本,低阶字节是主版本号

                        第二个参数是一个结构体,接收socket的实现细节

    1 WSADATA wsaData;
    2 WSAStartup(MAKEWORD(2,2),&wsaData);
    3 if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    4 {
    5   printf("请求版本失败"); 
    6   return ;  
    7 }
    View Code

     3.创建socket

      第一个参数表示要使用的协议族 : AF_INET IPv4的地址 和 端口号(16位)的组合

      第二个参数表示类型 SOCK_STREAM 流式socket , 面向连接的socket

      第三个参数指定协议 IPPROTO_TCP 使用 TCP 传输协议

    1 SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
    2 if(INVALID_SOCKET == severSocket)
    3 {
    4   printf("套接字创建失败");
    5   return ;    
    6 }
    View Code

     4.初始化协议地址族

    1 SOCKADDR_IN serverAddr = {0}; //初始化协议地址
    2 serverAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
    3 serverAddr.sin_prot = htons(8888);    //服务器端口,客户端通过这个端口连接
    4 
    5 //ip地址是点分格式的字符串 , 用inet_addr来转换整数
    6 serverAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
    View Code

    5.绑定

    1 if(SOCKET_ERROR == bind(serverSocket , (SOCKADDR*)&serverAddr , sizeof(serverAddr)))
    2 {
    3   printf("绑定失败");
    4   closesocket(serverSocket);  //释放socket
    5   WSACleanup();  //关闭套接字
    6   return ;  
    7 }
    8 printf("绑定成功");
    View Code

    6.监听

     listen的第二个参数是监听的个数 , 等待连接的队列最大长度

    1 if(SOCKET_ERROR == listen(serverSocket, 10))
    2 {
    3   printf("监听失败");
    4   closesocket(serverSocket);  //释放socket
    5   WSACleanup();  //关闭套接字
    6   return ;  
    7 }
    8 printf("监听成功");
    View Code

     7.接受连接

      accetp 第二第三个参数可以给NULL 表示不保存连接进来的客户端(ip)信息 , 不给NULL 表示保存客户端信息

     1 SOCKADDR_IN clientAddr = {0};
     2 int len = sizeof(clientAddr);
     3 SOCKET clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &len);    //阻塞函数
     4 if(clientSocket == INVALID_SOCKET)
     5 {
     6   printf("连接失败");
     7  closesocket(serverSocket);    //释放socket
     8  WSACleanup();   //关闭套接字
     9   return ;
    10 }
    11 printf("连接成功");
    12 printf("客户端(%s)
    " , inet_ntoa(clientAddr.sin_addr));
    View Code

     8.开始通讯

    recv的第一个参数表示客户端的socket 进行接收数据  , 第四个参数表示收发方式默认为0, 一次收完

     1 char recvBuff[128] = {};
     2 while(1)
     3 {
     4   memset(recvBuff, 0 , sizeof(recvBuff));
     5   if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0)  //阻塞函数
     6   {
     7        printf(">>%s
    " , recvBuff);
     8   }
     9     
    10   char sendBuff[128] = {};
    11   memset(sendBuff, 0 , sizeof(sendBuff));
    12   printf("请输入:
    ");
    13   scanf_s("%s" , sendBuff, sizeof(sendBuff)-1);
    14   //一次收发  
    15   send(clientSocket , sendBuff, strlen(sendBuff), 0);  
    16 }
    View Code

    9.关闭socket

    1 closesocket(clientSocket);
    2 closesocket(serverSocket);
    3 WSACleanup();
    View Code

    ################客户端

    1.准备工作导入头文件

    View Code

    2.确定版本信息

       MSAStartup :异步套接字的启动命令 .  第一个参数是版本请求,高阶字节是修订版本,低阶字节是主版本号

                        第二个参数是一个结构体,接收socket的实现细节

    View Code

     3.创建socket

      第一个参数表示要使用的协议族 : AF_INET IPv4的地址 和 端口号(16位)的组合

      第二个参数表示类型 SOCK_STREAM 流式socket , 面向连接的socket

      第三个参数指定协议 IPPROTO_TCP 使用 TCP 传输协议

    1 SOCKET clientSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
    2 if(INVALID_SOCKET == clientSocket)
    3 {
    4   printf("套接字创建失败");
    5   return ;    
    6 }
    View Code

     4.初始化协议地址族(初始化的是服务端的ip地址及端口, 表示连接用)

    1 SOCKADDR_IN clientAddr = {0}; //初始化协议地址
    2 clientAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
    3 clientAddr.sin_prot = htons(8888);    //服务器端口,客户端通过这个端口连接
    4 
    5 //ip地址是点分格式的字符串 , 用inet_addr来转换整数
    6 clientAddr.sin_addr.S_un.S_addr = inet_addr("172.0.0.1");
    View Code

     5.连接

    1 if(SOCKET_ERROR == connect(clientSocket , (sockaddr *)&clientAddr , sizeof(clientAddr)))
    2 {
    3   printf("连接失败");
    4  closesocket(clientSocket);    //释放socket
    5  WSACleanup();   //关闭套接字
    6   return ;
    7 }
    8 printf("连接成功");
    View Code

     8.开始通讯

    recv的第一个参数表示客户端的socket 进行接收数据  , 第四个参数表示收发方式默认为0, 一次收完

     1 char sendBuff[128] = {};
     2 while(1)
     3 {
     4   memset(sendBuff, 0 , sizeof(sendBuff));
     5   printf("请输入:
    ");
     6   scanf_s("%s" , sendBuff, sizeof(sendBuff)-1);
     7   //一次收发  
     8   send(clientSocket , sendBuff, strlen(sendBuff), 0);
     9 
    10   char recvBuff[128] = {};
    11   memset(recvBuff, 0 , sizeof(recvBuff));
    12   if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0)  //阻塞函数
    13   {
    14        printf(">>%s
    " , recvBuff);
    15   }  
    16 }
    View Code

    9.关闭socket

    1 closesocket(clientSocket);
    2 WSACleanup();
    View Code
  • 相关阅读:
    springboot2 整合雪花算法,并兼容分布式部署
    docker 在 linux 搭建私有仓库
    jdbc 几种关系型数据库的连接 和 driver_class,以及简单的使用
    springboot2 整合发送邮件的功能
    oracle 唯一新约束 和 逻辑删除的 冲突处理办法
    oracle 一些常见操作方法
    spring-cloud-stream 整合 rabbitmq
    springboot2 整合 rabbitmq
    docker 安装 rabbitmq 消息队列
    网络统计学目录
  • 原文地址:https://www.cnblogs.com/yxnrh/p/11480390.html
Copyright © 2020-2023  润新知