
从零构建通讯器--5.1TCP和IP协议
发布日期:2021-05-04 18:23:27
浏览次数:21
分类:技术文章
本文共 3808 字,大约阅读时间需要 12 分钟。
一:客户端与服务器
客户端:client,一般字母c表示
服务器:server,一般字母s表示 ,所以c/s一般就是 :客户端/服务器 (1.1)解析一个浏览器访问网页的过程 (1.2)客户端服务器角色规律总结 a)数据通讯总在两端进行,其中一端叫客户端,另一端叫服务器端; b)总有一方先泛起第一个数据包,这发起第一个数据包的这一端,就叫客户端【浏览器】;被动收到第一个数据包这端,叫服务器端【淘宝服务器】; c)连接建立起来,数据双向流动,这叫 双工【你可以发数据包给我,我也可以发数据包给你】 d)既然服务器端是被动接收连接,那么客户端必须得能够找到服务器在哪里;在编写网络通讯程序时,你只需要指定淘宝服务器的ip地址和淘宝服务器的端口号,就能够跟淘宝服务器进行通讯; e)epoll二:网络模型
(2.1)OSI七层网络模型:
物【物理层】 链【数据链路层】 网【网络层】 传【传输层】 会【会话层】 表【表示层】 应【应用层】 (2.2)TCP / IP协议四层模型 Transfer Control Protocol[传输控制协议]/Internet Protocol[网际协议]; tcp/ip实际是 一组 协议的代名词,而不仅仅是一个协议;三:最简单的客户端和服务器程序实现代码
a)客户端程序,服务器端程序;只具备演示价值,不具备商业价值。
b)最终epoll技术实现商用的服务器程序; c)《Unix网络编程》第一卷 (3.1)套接字socket概念 (3.2)一个简单的服务器端通讯程序范例【看调用了哪些函数:面试官可能 会考】 (3.3)IP地址简单谈 //我们写通讯程序代码时是否需要根据ipv4,ipv6来调整呢? //a)写服务器程序,不用考虑ipv4,ipv6的问题,遵照ipv4规则写就行; //b)写客户端程序,只演示ipv4版本的客户端范例。 //后续写项目老师会带着大家写同时兼容ipv4,ipv6【协议无关】客户端程序; (3.4)一个简单的客户端通讯程序范例 c/s建立连接时双方彼此都要有 ip地址 /端口号; 连接一旦建立起来,那么双方的通讯【双工收发】,就只需要用双方彼此对应的套接字即可; (3.5)客户端服务器程序综合演示和调用流程图 服务器端程序要先运行;四:TCP和UDP的区别
TCP(Transfer Control Protocol):传输控制协议
UDP(User Datagram Protocol):用户数据报协议 socket() 优缺点: a)tcp:可靠协议,必然要耗费更多的系统资源确保数据传输的可靠; //得到好处就是只要不断线,传输给对方的数据,一定正确的,不丢失,不重复,按顺序到达对端; b)udp:不可靠协议;发送速度特别快;但无法确保数据可靠性各自的用途:
a)tcp:文件传输,收发邮件需要准确率高,但效率可以相对差;一般TCP比UDP用的范围和场合更广; b)udp:qq聊天信息;DNS。。。。。。估计随着网络的发展,网络性能更好,丢包率更低,那么udp应用范围更广; client.c#include#include #include #include #include #include #include #include #define SERV_PORT 9000 //要连接到的服务器端口,服务器必须在这个端口上listen着int main(int argc, char *const *argv){ //这些演示代码的写法都是固定套路,一般都这么写 int sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建客户端的socket,大家可以暂时不用管这里的参数是什么,知道这个函数大概做什么就行 struct sockaddr_in serv_addr; memset(&serv_addr,0,sizeof(serv_addr)); //设置要连接到的服务器的信息 serv_addr.sin_family = AF_INET; //选择协议族为IPV4 serv_addr.sin_port = htons(SERV_PORT); //连接到的服务器端口,服务器监听这个地址 //这里为了方便演示,要连接的服务器地址固定写 if(inet_pton(AF_INET,"192.168.1.126",&serv_addr.sin_addr) <= 0) //IP地址转换函数,把第二个参数对应的ip地址转换第三个参数里边去,固定写法 { printf("调用inet_pton()失败,退出!\n"); exit(1); } //连接到服务器 if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0) { printf("调用connect()失败,退出!\n"); exit(1); } int n; char recvline[1000 + 1]; while(( n = read(sockfd,recvline,1000)) > 0) //仅供演示,非商用,所以不检查收到的宽度,实际商业代码,不可以这么写 { recvline[n] = 0; //实际商业代码要判断是否收取完毕等等,所以这个代码只有学习价值,并无商业价值 printf("收到的内容为:%s\n",recvline); } close(sockfd); //关闭套接字 printf("程序执行完毕,退出!\n"); return 0;}
server.c
#include#include #include #include #include #include #include #include #define SERV_PORT 9000 //本服务器要监听的端口号,一般1024以下的端口很多都是属于周知端口,所以我们一般采用1024之后的数字做端口号int main(int argc, char *const *argv){ //这些演示代码的写法都是固定套路,一般都这么写 //服务器的socket套接字【文件描述符】 int listenfd = socket(AF_INET, SOCK_STREAM, 0); //创建服务器的socket,大家可以暂时不用管这里的参数是什么,知道这个函数大概做什么就行 struct sockaddr_in serv_addr; //服务器的地址结构体 memset(&serv_addr,0,sizeof(serv_addr)); //设置本服务器要监听的地址和端口,这样客户端才能连接到该地址和端口并发送数据 serv_addr.sin_family = AF_INET; //选择协议族为IPV4 serv_addr.sin_port = htons(SERV_PORT); //绑定我们自定义的端口号,客户端程序和我们服务器程序通讯时,就要往这个端口连接和传送数据 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //监听本地所有的IP地址;INADDR_ANY表示的是一个服务器上所有的网卡(服务器可能不止一个网卡)多个本地ip地址都进行绑定端口号,进行侦听。 bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//绑定服务器地址结构体 listen(listenfd, 32); //参数2表示服务器可以积压的未处理完的连入请求总个数,客户端来一个未连入的请求,请求数+1,连入请求完成,c/s之间进入正常通讯后,请求数-1 int connfd; const char *pcontent = "I sent sth to client!"; //指向常量字符串区的指针 for(;;) { //卡在这里,等客户单连接,客户端连入后,该函数走下去【注意这里返回的是一个新的socket——connfd,后续本服务器就用connfd和客户端之间收发数据,而原有的lisenfd依旧用于继续监听其他连接】 connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); //发送数据包给客户端 write(connfd,pcontent,strlen(pcontent)); //注意第一个参数是accept返回的connfd套接字 //只给客户端发送一个信息,然后直接关闭套接字连接; close(connfd); } //end for close(listenfd); //实际本简单范例走不到这里,这句暂时看起来没啥用 return 0;}
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月12日 01时36分19秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2020年制冷与空调设备运行操作答案解析及制冷与空调设备运行操作考试总结
2019-03-03
2020年保育员(初级)考试资料及保育员(初级)新版试题
2019-03-03
2020年茶艺师(高级)考试内容及茶艺师(高级)考试申请表
2019-03-03
2021年烟花爆竹经营单位安全管理人员考试及烟花爆竹经营单位安全管理人员考试试卷
2019-03-03
2021年过氧化工艺试题及答案及过氧化工艺考试平台
2019-03-03
2021年重氮化工艺考试题库及重氮化工艺考试报名
2019-03-03
2021年车工(高级)考试总结及车工(高级)试题及答案
2019-03-03
2021年压力焊证考试及压力焊实操考试视频
2019-03-03
2021年低压电工考试及低压电工考试申请表
2019-03-03
2021年低压电工考试及低压电工考试申请表
2019-03-03
2021年A特种设备相关管理(电梯)考试APP及A特种设备相关管理(电梯)复审考试
2019-03-03
2021年美容师(初级)考试报名及美容师(初级)新版试题
2019-03-03
2021年N1叉车司机考试题及N1叉车司机复审模拟考试
2019-03-03
2021年危险化学品经营单位主要负责人考试APP及危险化学品经营单位主要负责人多少钱
2019-03-03
2021年T电梯修理考试技巧及T电梯修理模拟考试软件
2019-03-03
2021年电工(初级)考试及电工(初级)报名考试
2019-03-03
2021年R2移动式压力容器充装考试题及R2移动式压力容器充装找答案
2019-03-03
2021年高处安装、维护、拆除考试资料及高处安装、维护、拆除证考试
2019-03-03
2021年电工(初级)考试及电工(初级)证考试
2019-03-03