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

1.准备工作导入头文件

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

2.确定版本信息

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

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

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

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. }

4.初始化协议地址族

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

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("绑定成功");

6.监听

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

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

7.接受连接

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

  1. SOCKADDR_IN clientAddr = {};
  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)\n" , inet_ntoa(clientAddr.sin_addr));

8.开始通讯

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

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

9.关闭socket

  1. closesocket(clientSocket);
  2. closesocket(serverSocket);
  3. WSACleanup();

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

1.准备工作导入头文件

  1.  

2.确定版本信息

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

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

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. }

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

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

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("连接成功");

8.开始通讯

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

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

9.关闭socket

  1. closesocket(clientSocket);
  2. WSACleanup();

Windows的socket编程的更多相关文章

  1. [补] windows C socket编程——大物实验预约

    注 : 心血来潮,想着把这两年没能记录下来的经历,写一波回忆杀.诚然,有些经历十分复杂繁琐,希望能耐下性子,写出好文章来,可惜一时不能全想起来这两年来的种种,就想起来什么便写什么吧. 时间估摸着是大一 ...

  2. 记一次:Windows的Socket编程学习和分析过程

    Socket编程依赖于:WS2_32.dll --- 服务端 --- .导入我们需要的函数 #incldue <windows.h> //#include<WinSock2.h> ...

  3. windows下socket编程:区分shutdown()及closesocket()

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  4. windows下socket编程实现client和server双向通信

    服务端代码server.c // server.cpp : Defines the entry point for the console application. // #include <s ...

  5. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  6. Windows Phone下的Socket编程

    讨论下有关于Windows Phone下的Socket编程方面的知识. Socket就是通常所称的套接字,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过Socket向网络发出请求或者应答 ...

  7. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  8. 转:socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

  9. socket编程在windows和linux下的区别

    如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...

随机推荐

  1. zabbix-trap

    安装 yum -y install zabbix-sender zabbix sender 在客户端给server端发送信息, -z 指定server的ip -p 指定端口 10051 -s 被监控设 ...

  2. linux命令之------Tar解压缩

    Tar解压缩 作用:将解压缩后缀名为tar的压缩包 -f<备份文件>或—file=<备份文件>指定备份文件 -v或-verbose显示指令执行过程 -x或-extract或-g ...

  3. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

  4. Lomok @Data使用

    看了廖师兄的Springboot视频发现很多很好玩的小工具,lombok就是其中一个.lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来 ...

  5. Fluent Meshing对称模型形成完整模型

    原视频下载地址:https://pan.baidu.com/s/1i4NZnVZ 密码:ts5a

  6. Oracle复习思路

    目录 Oracle复习 题型 复习大纲 附录 SQL题目一 SQL题目二 SQL题目三 SQL题目四 SQL题目五 SQL题目六 Oracle复习 题型 选择题15题 每题2分,共30分 判断题10题 ...

  7. flask 实现最简单的登录功能

    视图函数如下: # Sample.py from flask import Flask, render_template, url_for, request, redirect app = Flask ...

  8. leetcode 10. Regular Expression Matching 、44. Wildcard Matching

    10. Regular Expression Matching https://www.cnblogs.com/grandyang/p/4461713.html class Solution { pu ...

  9. 011-数据结构-树形结构-B+树[mysql应用]、B*树

    一.B+树概述 B+树是B树的变种,有着比B树更高的查询效率. 一棵 B+ 树需要满足以下条件: 节点的子树数和关键字数相同(B 树是关键字数比子树数少一) 节点的关键字表示的是子树中的最大数,在子树 ...

  10. matlab学习笔记8 基本绘图命令-LineSpec线条设定

    一起来学matlab-matlab学习笔记8 基本绘图命令_4 LineSpec线条设定 觉得有用的话,欢迎一起讨论相互学习~Follow Me 绘图函数接受线条设定作为参数并相应地修改生成的图形.您 ...