网络编程之TCP server
基本概念
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相关推荐
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...
- Python中的网络编程之TCP
Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...
- Centos网络编程之tcp十一种状态及问题处理办法
尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...
- 网络编程之TCP协议与UDP对比
网络编程之TCP协议与UDP对比 UDP协议: 1,面向无连接. 2,不可靠协议,容易丢包. 3,速度快. 4,包体积有限制,64k以内. 通常,聊天,在线视频,凌波. TCP协议: 1.面向连接. ...
- java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...
- 网络编程之TCP客户端程序开发
网络编程之TCP客户端程序开发 1. 开发 TCP 客户端程序开发步骤 2. socket 类的介绍 3. TCP 客户端程序开发示例代码 4. 小结 1. 开发 TCP 客户端程序开发步骤 创建客户 ...
- Linux网络编程之TCP状态转移
Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...
- 网络编程之Tcp,udp
1.TCP 2.补充异常处理 3.UDP 一TCP. 1.socket基础版本通讯 服务端: 1 import socket 2 3 server = socket.socket()# 生成一个对象 ...
最新文章
- leetcode Merge Two Sorted Lists
- Java获取当前路径和读取文件
- ORACL内部异常:
- 关闭子页面刷新父页面,不需要弹出确认窗口
- 仔细讨论 C/C++ 字节对齐问题⭐⭐
- 每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加
- TensorFlow 2.0 自定义操作与建模方式
- php 多文件上传与下载,php实现文件下载跟多文件上传
- Salesforce 中获取数据表字段的 picklist 的值
- Java递归一个四十万的树结构_java递归展示树形图代码实现以及遇到的问题
- Eclipse调试提示:Breakpoint attribute problem: installation failed
- Android的JNI【实战教程】6⃣️--温控计
- oracle理论笔试题,Oracle数据库笔试题(附答案)
- pdf打印机如何加入背景
- kali linux 如何升级,如何正确更新和升级您的Kali Linux
- 51单片机的仿真实验——1602显示屏显示万年历与温度
- 自定义view从0到1
- matlab函数怎么写,matlab怎么写函数
- python通过手机拍摄的视频图片进行人脸头像采集
- python用循环打出阶梯图形_Python制图你真的会吗?一文学会如何绘制漂亮的阶梯图...