在上篇博客中讲到了三次握手和四次挥手:

Linux网络编程--TCP中的三次握手和四次挥手_神厨小福贵!的博客-CSDN博客服务器编程和客户端编程的大致流程如下:三次握手是在客户端中的connect中完成的,具体如下:那么上述说到的SYN ACK这些是什么东西呢?上述的截图取自《Linux高性能服务器编程》电子版的截图!+根据书中所提到的在客户端对服务器端connect的时候,由客户端对服务器端发出一个SYN的请求连接的报文,值为i是32位序列号,然后服务器收到客户端SYN之后,会反馈给客户端一个自身服务器端的SYN报文和确认号报文ACK,其中ACK的值为客户端和服务器端的SYN序...https://blog.csdn.net/qq_45829112/article/details/122278769?spm=1001.2014.3001.5501

这篇我们来说一下TCP协议下服务器端和客户端的程序设计!

先来看下客户端和服务器端的设计原理:

过程如上,具体的就是客户端和服务器创建socket创建套接字,bind将本地地址和套接字绑在一起,listen创建监听队列,客户端通过connect三次握手与服务器连接,然后服务器accept接受客户端的连接请求,客户端向服务器send数据,服务器再对客户端send响应数据。大致流程就这样,下面面来看代码演示:

服务器端:

1.创建socket套接字

int sockfd = socket(AF_INET,SOCK_STREAM,0);

int socket(int domain,int type, int protocol) 返回值为非负描述符的话-----成功,返回值为-1的话--失败

socket参数详解:取自《Linux高性能服务器编程》

咱们测试用的是IPV4的网络,所以用的是AF_INET(书上写的是PF_INET,在Windows中AF_INET和PF_INET是一样的)

2.bind将套接字绑定到一个地址

int res = bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

bind函数的返回值:成功----返回0       失败----返回-1

bind 参数详解:sockfd为第一步socket创建套接字返回的描述符

const struct sockaddr *addr为指向一个struct sockaddr类型的结构体变量,此结构体成员用于设置要绑定的ip和端口

addrlen为结构体大小

3.listen创建监听队列

int res = listen(sockfd,5);

listen参数详解:

sockfd 为 创建套接字的返回描述符;

backlog为已完成连接队列个数

4.accept在套接字已完成队列中接收一个连接

int res = accept(sockfd,const struct sockaddr *addr,socklen_t addrlen);

accept参数的详解:

参数:取自百度百科

5.recv和send

size_t recv(int sockfd,void* buf,size_t len,int flags);size_t send(int sockfd,const void* buf,size_t len,int flags);

​​​​​​参数详解:
对于recv来说,sockfd为客户端对应套接字,buf 为存放接收数据的地方,len为存放数据区的大小,flags一般置为0

对send来说:sockfd接收端的套接字描述符,要发送的消息,发送消息的大小,flags一般置为0

客户端

客户端只有一个connect在服务器端中没有出现

connect参数详解:

sockfd是socket返回的描述符

那个saddr是服务器端的地址

len是服务器端的saddr大小

服务器端代码演示

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接字assert(sockfd != -1);struct sockaddr_in saddr,caddr; //sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,saddr代表服务器端地址  caddr代表客户端地址memset(&saddr,sizeof(saddr),0);//saddr其实有四项成员,最后一项用来占位的,必须搞为0,索性我们开始直接给全部置为0,后面再来绑定ip和端口saddr.sin_family = AF_INET;//地址族,TCP/ipv4协议族saddr.sin_port = htons(6000);//端口为小端序列,htons转换为网络字节序,也是大端字节序(一般使用都是5000以上,5000以内一般都是特定使用的,比如你办了个手机卡,你能用110这个号码嘛,博客园因为110有特殊意义,一个道理)saddr.sin_addr.s_addr = inet_addr("192.168.0.108");//自己本地的IP地址(ifconfig)//inet_addr将点分十进制转换为午饭后整型int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//将sockfd和本地IP绑定//为什么要这个呢(struct sockaddr*)强转呢,bind这个参数类型为struct sockaddr与sockaddr_in类型不一致,所以强转assert(res != -1);res = listen(sockfd,5);//监听队列assert(res != -1);while(1){int len = sizeof(caddr);int c = accept(sockfd,(struct sockaddr*)&caddr,&len); //accept参数中第三个参数为结构体大小的一个指针,所以前面求lenif( c < 0 ){continue;}printf("accept caddr = %d , caddr.ip = %s , caddr.port = %d \n",c,inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));char buff[128] = {0};int n = recv(c,buff,127,0);printf("recv:(%d) = %s",n,buff);send(c,"ok",2,0);close(c);}
}

客户端代码演示

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);assert(sockfd != -1);struct sockaddr_in saddr;saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("192.168.0.108");int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//那个强转的话,和服务器端呢个强转是大同小异的assert (res != -1);char buff[128] = {0};printf("input: \n");fgets(buff,128,stdin);send(sockfd,buff,strlen(buff),0);memset(buff,0,128);recv(sockfd,buff,127,0);printf("buff = %s  \n",buff);close(sockfd);exit(0);
}

这样的话,简单的服务器和客户端的编程就完成了,下面来看运行结果:

 当然这次的编程代码只能接受一个数据,想要接受多个数据,或者多线程共同访问一个服务器的话,在这个基础上改一下代码即可,后面再出一篇文章来讲这个东西!

这就是我对socket编程的理解,如有不到位的地方,欢迎各位指出,共同学习,共同进步!

“任何一个不曾起舞的日子,都是对未来的辜负!”

TCP协议的服务器与客户端的程序设计(代码注释超详细)相关推荐

  1. 利用TCP协议完成服务器与客户端之间文件传输

    利用TCP文件传输协议模拟与服务器的文件上传.下载操作,以及进入各种目录和列举当前目录文件状态操作.ls为查看当前目录,cd+目录名进入该目录,cd -则返回上一级目录,dow加文件名则下载文件到本地 ...

  2. 网络编程:使用tcp协议实现服务器与客户端交互

    服务器 ************************************************************************************************ ...

  3. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序-20210414073352.docx-原创力文档...

    用Socket套接字实现 DAY TIME 协议的服务器和客户端程序 一.设计目的 为了提高同学的自主动手能力,把理论知识运用于实 践中,从实践中更好的领悟所学的知识. 二.题目要求及需求分析 网络I ...

  4. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序.doc...

    用Socket套接字实现DAYTIME协议的服务器和客户端程序.doc 一. 设计目的 为了提高同学的自主动手能力,把理论知识运用于实践中,从实践中更好的领悟所学的知识 . 二. 题目要求及需求分析 ...

  5. daytime协议的服务器和客户端程序,用socket套接字实现daytime协议服务器和客户端程序.doc...

    文档介绍: 用socket套接字实现daytime协议服务器和客户端程序.doc一.设计目的为了提高同学的自主动手能力,把理论知识运用于实践中,从实践中更好的领悟所学的知识.二.题目要求及需求分析1. ...

  6. daytime协议的服务器和客户端程序,用socket套接字实现daytime协议的服务器和客户端程序精编版.doc...

    用socket套接字实现daytime协议的服务器和客户端程序精编版.doc 还剩 11页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: ------- ...

  7. Linux下编写UDP/TCP版本的服务器和客户端的流程

    Linux下编写UDP/TCP版本的服务器和客户端的流程 文章目录 Linux下编写UDP/TCP版本的服务器和客户端的流程 一:UDP和TCP的区别 二.UDP编写服务器的步骤 三.UDP编写客户端 ...

  8. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序-20210726002244.doc-原创力文档...

    一.设计目的 为了提高同学的自主动手能力,把理论知识运用于实 践中,从实践中更好的领悟所学的知识. 二.题目要求及需求分析 1.网络I/O程序设计:用Socket套接字实现DAYTIME 协 议的服务 ...

  9. TCP协议服务端与客户端

    一.TCP/IP协议简介 什么是TCP/IP TCP/IP协议是一种用于因特网的通信协议.TCP指传输控制协议(Transmission Control Protocol),IP指网际协议(Inter ...

最新文章

  1. 单链表:头结点和头指针的实现方式
  2. cv2.xfeatures2d.SIFT_create()时报错The function/feature is not implemented
  3. PMP-【第14章 五大过程组的工作要点】2021-2-17(292页-303页)
  4. 【Linux系统】Linux命令之文件管理
  5. shell连接工具_盘点下我用的顺手的那些工具
  6. InnoDB的内存结构和特性
  7. sparksql 保存点_Spark(十二)【SparkSql中数据读取和保存】
  8. php数组是有序,php判断一个数组是否为有序的方法
  9. Office2016专业增强版与Visio2016专业版不能共存的解决办法
  10. 于的繁体字有几种写法_写字繁体字有几种写法 , 辈 字 用繁体字有几种写法?...
  11. 7、乐趣国学—趣谈“圣贤”
  12. .ftl文件 是什么文件
  13. 教你如何在交换机上查询并看懂光模块DDM信息
  14. matlab仿真integrator,弹球的仿真 - MATLAB Simulink - MathWorks 中国
  15. 周边pd是什么意思_饭圈说的pd意思 饭圈pb是什么意思的缩写
  16. 一元多项式加减乘实现c/c++
  17. 【分层强化学习】HAC源码解读
  18. 软件工程专业,大学期间最重要的是学好哪些知识?
  19. 有什么好用的苹果群控软件?
  20. 计算机接口与技术 英语怎么说,微型计算机接口与技术考点(国外英文资料).doc...

热门文章

  1. RADAR和LIDAR区别分析
  2. 数据、人工智能和传感器按COVID-19新冠流感排列
  3. 2021年大数据Spark(十二):Spark Core的RDD详解
  4. 【其他】将幕布文章OPML转换为Markdown的方法
  5. cad沿线插入块 lisp_CAD制图软件中如何快速绘制推拉窗平面简图
  6. Recyclerview 添加一个数组
  7. 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:7. 服务调用
  8. python语言几个常见函数的使用
  9. 一个整型数组里除了两个数字之外,其他的数字都出现了两次
  10. [BZOJ3337] ORZJRY I --块状链表大毒瘤