基本概念

socket:连接应用程序与网络驱动的桥梁

面向连接的套接字:即TCP,按顺序传输数据,数据不会丢失,不存在数据边界

面向消息的套接字:即UDP,强调快速传输,不一定按顺序传输,数据可能会丢失,存在数据边界

数据边界:会把数据拆分成多个进行传输

C/S模式:服务器先启动,根据请求提供相应的服务,打开一个通信通道,在某一地址和端口上接受请求,等待客户的请求,接受到请求后,发送应答信息,完成后,又打开通信通道,等待另外的请求,最后关闭服务器

客户端:打开通信通道,连接主机,向主机发送请求,等待并接受应答,继续发送请求,最后关闭通道

套接字:

套接字类型 代表的协议 VS中查看定义 特点
SOCK_STREAM TCP #define  1 面向连接、不支持广播、多播
SOCK_DGRAM IP #define  2 无连接,支持广播、多播
 SOCK_RAW  #define  3

基本函数

socket:创建套接字              ========  bind:  套接字绑定地址和端口

connect:  请求连接                ========  listen:监听

accept:接受请求                 ========  close:关闭连接

send:用于TCP,发送数据      ======= recv:用于TCP,接受数据

sendto:用于UDP,发送数据   ======  recvfrom:用于UDP,发送数据

数据结构:

sockaddr

typedef struct sockaddr
{u_short sa_family;    /指定IPV4还是IPV6CHAR sa_data[14];     /IP+port
}

这个是给系统用的,包含了16个字节,

typedef struct sockaddr_in
{short   sin_family;    /指定IPV4还是IPV6  2字节USHORT sin_port;       /16位port号        2字节IN_ADDR sin_addr;      /32位ip地址        4字节CHAR sin_zero[8];      /8位字节填充       8字节
}

这个是给程序员用的,因为可以将IP和port分开

代码

首先要包含头文件winsock2.h,还要引入库文件

#pragma comment(lib, "ws2_32.lib")

最开始,要记得初始化网络库,如果没有初始化,就会导致socket建立失败,如果初始化了,就会把消息阻塞在第五步,accept那里

...代码太长,不写了    /初始化套接字

第一步,创建套接字sockSrv

    SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);/AF_INET:协议族,sock-stream:TCP ,第三个默认为0

为创建增加容错机制

    if (INVALID_SOCKET == sockSrv){printf("socket errorNum = %d\n", GetLastError());return -1;}

INVALID_SOCKET表示无效的socket

第二步,确定网络地址

    SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/h-host,n-netework,l-long,将主机转换成网络长字节/都是固定写法,而INADDR-ANY表示任意地址addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(6000); /h-host,n-netework,s-short,将主机转换成网络短字节/6000表示6000端口

定义一个程序员用的结构体addrSrv确定它的网络地址

第三步,绑定、监听,监听的第二个参数为5,表示等待连接的客户端为5个,而不是能同时连接5个客户端,顺序为先近先出,第6个只有等到第一个关闭了,它才能连接上,从左往右,先进先出

<<<======1 2 3 4 5  <<<===6
    bind(sockSrv,(SOCKADDR *) &addrSrv, sizeof(SOCKADDR));listen(sockSrv, 5);

绑定上面创建的套接字sockSrv和网络地址addrSrv,监听套接字sockSrv,为绑定和监听增加容错机制

if (SOCKET_ERROR ==bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR))){printf("bind errorNum = %d\n", GetLastError());return -1;}
.../监听类似

第四步,定义一个系统用的网络地址

    SOCKADDR_IN addrCli;int len = sizeof( SOCKADDR );

第五步,定义一台分机处理客户端

while (true){SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrCli, &len);/准备发数据char sendBuff[100] = { 0 };/打印hellosprintf_s(sendBuff, 100, "hello");/发数据int iLen = send(sockConn, sendBuff, strlen(sendBuff),0);

这里的accept第一个参数为处于侦听状态的套接字,它的返回值是一个新的套接字

第六步,接收数据

        char recvBuff[100] = { 0 };iLen = recv(sockConn, recvBuff, 100, 0);printf("%s", recvBuff);

在服务器端,当调用 accept 函数接受来自客户端的连接请求后,会返回一个新的 socket 描述符,该描述符用于与客户端通信。对于这个新的 socket 描述符,可以使用 recv 函数接收来自客户端发来的数据。

在客户端,连接服务器成功后,也会返回一个 socket 描述符,可以使用 recv 函数从服务器接收数据。

最后,关闭分机,并清理socket

 closesocket(sockConn);WSACleanup();
}closesocket(sockSrv);WSACleanup();

网络编程之TCP server相关推荐

  1. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  2. Python中的网络编程之TCP

    Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...

  3. Centos网络编程之tcp十一种状态及问题处理办法

    尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...

  4. 网络编程之TCP协议与UDP对比

    网络编程之TCP协议与UDP对比 UDP协议: 1,面向无连接. 2,不可靠协议,容易丢包. 3,速度快. 4,包体积有限制,64k以内. 通常,聊天,在线视频,凌波. TCP协议: 1.面向连接. ...

  5. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  6. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...

  7. 网络编程之TCP客户端程序开发

    网络编程之TCP客户端程序开发 1. 开发 TCP 客户端程序开发步骤 2. socket 类的介绍 3. TCP 客户端程序开发示例代码 4. 小结 1. 开发 TCP 客户端程序开发步骤 创建客户 ...

  8. Linux网络编程之TCP状态转移

    Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...

  9. 网络编程之Tcp,udp

    1.TCP 2.补充异常处理 3.UDP 一TCP. 1.socket基础版本通讯 服务端: 1 import socket 2 3 server = socket.socket()# 生成一个对象 ...

最新文章

  1. leetcode Merge Two Sorted Lists
  2. Java获取当前路径和读取文件
  3. ORACL内部异常:
  4. 关闭子页面刷新父页面,不需要弹出确认窗口
  5. 仔细讨论 C/C++ 字节对齐问题⭐⭐
  6. 每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加
  7. TensorFlow 2.0 自定义操作与建模方式
  8. php 多文件上传与下载,php实现文件下载跟多文件上传
  9. Salesforce 中获取数据表字段的 picklist 的值
  10. Java递归一个四十万的树结构_java递归展示树形图代码实现以及遇到的问题
  11. Eclipse调试提示:Breakpoint attribute problem: installation failed
  12. Android的JNI【实战教程】6⃣️--温控计
  13. oracle理论笔试题,Oracle数据库笔试题(附答案)
  14. pdf打印机如何加入背景
  15. kali linux 如何升级,如何正确更新和升级您的Kali Linux
  16. 51单片机的仿真实验——1602显示屏显示万年历与温度
  17. 自定义view从0到1
  18. matlab函数怎么写,matlab怎么写函数
  19. python通过手机拍摄的视频图片进行人脸头像采集
  20. python用循环打出阶梯图形_Python制图你真的会吗?一文学会如何绘制漂亮的阶梯图...

热门文章

  1. vue props配置对象
  2. Cacti安装到简单使用
  3. 华云数据推动政府服务数字化:西企服平台政企服务大厅正式启动
  4. 双11电商店铺活动怎么推广?
  5. java -- IO流之字节流
  6. 利用微波技术,亚瑟士要为用户打造独一无二定制化跑鞋
  7. 使用java语言基于SMTP协议手写邮件客户端
  8. python随机分组的方法_Python 分组处理
  9. 上海亚商投顾:沪指延续调整 机器人概念股掀涨停潮
  10. vs2017编译libass静态库,并添加到ffmpeg中去,以支持ass,subtitles滤镜