我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:天空彩票 > 端点编码 >

TCP 客户端 服务端详细代码

归档日期:04-17       文本归类:端点编码      文章编辑:爱尚语录

  基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下:

  对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三次握手,而这个连接的过程是由内核完成,不是这个函数完成的,这个函数的作用仅仅是通知 Linux 内核,让 Linux 内核自动完成 TCP 三次握手连接(三次握手详情,请看《浅谈 TCP 三次握手》),最后把连接的结果返回给这个函数的返回值(成功连接为0, 失败为-1)。

  通常的情况,客户端的connect() 函数默认会一直阻塞,直到三次握手成功或超时失败才返回(正常的情况,这个过程很快完成)。

  对于服务器,它是被动连接的。举一个生活中的例子,通常的情况下,移动的客服(相当于服务器)是等待着客户(相当于客户端)电话的到来。而这个过程,需要调用listen()函数。

  这里需要注意的是,listen()函数不会阻塞,它主要做的事情为,将该套接字和套接字对应的连接队列长度告诉 Linux 内核,然后,listen()函数就结束。

  这样的话,当有一个客户端主动连接(connect()),Linux 内核就自动完成TCP 3次握手,将建立好的链接自动存储到队列中,如此重复。

  所以,只要 TCP 服务器调用了 listen(),客户端就可以通过 connect() 和服务器建立连接,而这个连接的过程是由内核完成。

  下面为测试的服务器和客户端代码,运行程序时,要先运行服务器,再运行客户端:

  #include stdio.h #include unistd.h #include string.h #include stdlib.h #include arpa/inet.h #include sys/socket.h #include netinet/in.h int main(int argc, char *argv[]) { unsigned short port = 8000; // 服务器的端口号 char *server_ip = 10.221.20.12; // 服务器ip地址 int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建通信端点:套接字 if(sockfd 0) { perror(socket); exit(-1); } struct sockaddr_in server_addr; bzero(&server_addr,sizeof(server_addr)); // 初始化服务器地址 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 主动连接服务器 if(err_log != 0) { perror(connect); close(sockfd); exit(-1); } system(netstat -an grep 8000); // 查看连接状态 while(1); return 0; }

  这里详细的介绍一下 listen() 函数的第二个参数(backlog)的作用:告诉内核连接队列的长度。

  为了更好的理解 backlog 参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列:

  1、未完成连接队列(incomplete connection queue),每个这样的 SYN 分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的 TCP三次握手过程。这些套接口处于 SYN_RCVD 状态。

  当来自客户的 SYN 到达时,TCP 在未完成连接队列中创建一个新项,然后响应以三次握手的第二个分节:服务器的 SYN 响应,其中稍带对客户 SYN 的 ACK(即SYN+ACK),这一项一直保留在未完成连接队列中,直到三次握手的第三个分节(客户对服务器 SYN 的 ACK )到达或者该项超时为止(曾经源自Berkeley的实现为这些未完成连接的项设置的超时值为75秒)。

  backlog 参数历史上被定义为上面两个队列的大小之和,大多数实现默认值为 5,当服务器把这个完成连接队列的某个连接取走后,这个队列的位置又空出一个,这样来回实现动态平衡,但在高并发 web 服务器中此值显然不够。

  accept()函数功能是,从处于 established 状态的连接队列头部取出一个已经完成的连接,如果这个队列没有已经完成的连接,accept()函数就会阻塞,直到取出队列中已完成的用户连接为止。

  如果,服务器不能及时调用 accept() 取走队列中已完成的连接,队列满掉后会怎样呢?UNP(《unix网络编程》)告诉我们,服务器的连接队列满掉后,服务器不会对再对建立新连接的syn进行应答,所以客户端的 connect 就会返回 ETIMEDOUT。但实际上Linux的并不是这样的!

  下面为测试代码,服务器 listen() 函数只指定队列长度为 2,客户端有 6 个不同的套接字主动连接服务器,同时,保证客户端的 6 个 connect()函数都先调用完毕,服务器的 accpet() 才开始调用。

  按照 UNP 的说法,连接队列满后(这里设置长度为 2,发了 6 个连接),以后再调用 connect() 应该统统超时失败,但实际上测试结果是:有的 connect()立刻成功返回了,有的经过明显延迟后成功返回了。对于服务器 accpet() 函数也是这样的结果:有的立马成功返回,有的延迟后成功返回。

  对于上面服务器的代码,我们把lisen()的第二个参数改为大于 6 的数(如 10),重新运行程序,发现,客户端 connect() 立马返回成功, 服务器 accpet() 函数也立马返回成功。

  TCP 的连接队列满后,Linux 不会如书中所说的全部拒绝连接,有些会延时连接,有些会连接不上(当队列的长度指定为 0 ),写程序时服务器的 listen() 的第二个参数最好还是根据需要填写,写太大不好(具体可以看cat /proc/sys/net/core/somaxconn,默认最大值限制是 128),浪费资源,写太小也不好,延时建立连接(也有可能连接不上)。

  packageyuwei.tcp;/**客户端:*通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机*因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端*存在,并连接成...博文来自:鱼尾九八

  背景因为最近在研究网络相关的东西,因此经常要写程序做实验来验证。主要是TCP通信,因此就写了个简单的基于TCP通信的小程序,方便以后要使用的时候能直接复用,省的还要各种谷歌、百度。功能介绍写的很简单,...博文来自:Blue summer的博客

  一、实验目的学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:博文来自:Skycrab

  socket套接字的使用socket服务器端和客户端通信,面向TCP的文章链接:http...博文来自:魏波

  上一篇讲了服务器端的实现,这一篇就是客户端的实现.   服务器实现参考:《C#如何利用SocketAsyncEventArgs实现高效能TCPSocket通信(服务器实现)》   与服务器不同的是...博文来自:freshflower

  一、TCP介绍先放这里有时间在写,最近在写DuiLib相关的使用内容,这部分大家凑活着看二、程序截图下载链接链接:博文来自:大头的博客

  上回说到UDP协议,与之对应的便是TCP协议TCP协议TCP协议全称:传输控制协议,顾名思义,就是要对数据的传输进行一定的控制.先来看看它的报头我们来分析分析每部分的含义和作用源端口号/目的端口号:表...博文来自:如故的博客

  服务器初始化(1)调用socket,创建文件描述符(2)调用bind,将文件描述符与ip/port连接起来。若端口号已被占用,则bind失败(3)调用listen,声明该文件描述符是服务器的一个文件描...博文来自:的博客

  本篇文章实现了一个基于TCP的博文来自:shenjie12345678的专栏

  该程序的服务端大概工作逻辑如左图:首先说说这个程序的作用:这个程序可用于多个客户端通过连接服务器来互相通信。如qq群聊。当一个客户端有信息发过来后,服务端就会通过客户端队列转发给其他客户端先上代码:/...博文来自:ZJE

  1、生活中的“打电话”实例(TCP)    (1)买个手机    (2)插上手机卡    (3)设计手机为正常接听状态(即能够响铃)    (4)静静的等着别人拨打    (5)挂断手机,结束通线、...博文来自:super_jackey的博客

  今天有个童鞋向我问了一下关于C#中的TCP操作,我当时给他讲了一下,感觉这个东西还是需要有代码才能讲清楚。这里我只贴异步的代码。异步看明白了,同步自然就不用多说了。      首先我说一下...博文来自:u012249710的专栏

  TCP的一些基本概念TCP(TransmissionControlProtocol传输控制协议)是一种面向连接的、可靠的、基于字节流(当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流)的传...博文来自:Megustas_JJC的博客

  作为传输层的主要协议,TCP协议不仅可以支持本地的数据通信,还可以支持跨网络的进程间通信。在偌大的互联网中,我们可以通过“IP地址+端⼜号”标识互联网中唯一的一个进程。然而,“IP地址+端⼜号”就称为...博文来自:如风

  tcp客户端tcp客户端,并不是像之前一个段子:一个顾客去饭馆吃饭,这个顾客要点菜,就问服务员咱们饭店有客户端么,然后这个服务员非常客气的说道:先生我们饭店不用客户端,我们直接送到您的餐桌上如果,不学...博文来自:a984120978的博客

  假设你只有一台电脑,还不能连接上Internet,那如何进行网络编程呢?用回测地址吧。     服务端的程序为:...博文来自:stpeace的专栏

  一、创建TCP传输的客户端1、建立TCP客户端的Socket服务,使用的是Socket对象,建议该对象一创建就明确目的地,即要连接的主机;2、如果连接建立成功,说明数据传输通道已建立,该通道就是Soc...博文来自:CG国斌的博客

  下图是基于TCP协议的客户端/服务器程序的一般流程:服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()...博文来自:luo809976897的专栏

  在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的。但是它有些缺陷,比如说效率较低等。而从这篇文章开始将介绍socket编程。socket是通过TCP,UDP,IP...博文来自:Timmiy的博客

  转自:前面几篇中实现的client每次运行只能从命令行读取一个字符串发给服务器,再从服务器...博文来自:sinat_35297665的博客

  不久前,我的SocketClient程序遇到了一个非常尴尬的错误。它本来应该在一个socket长连接上持续不断地向服务器发送数据,如果socket连接断开,那么程序会自动不断地重试建立连接。有一天发现...博文来自:很多时候犯错都是在不知情的情况下发生的

  使用异步客户端套接字异步客户端套接字在等待网络操作完成时不挂起应用程序。相反,它使用标准.NET框架异步编程模型在一个线程上处理网络连接,而应用程序继续在原始线程上运行。异步套接字适用于大量使用网络或...博文来自:BeelinkerLidejun的专栏

  C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜~~~下面是我用C#写的一个简单的TCP通信,主要的功能有:(1)多个客户端与服务器间的数据交流(2)可以实现群发的功能(3)客户端与服务端可以...博文来自:chwei_cson的专栏

  基于TCP的服务端/客户端 根据数据传输方式不同,基于网络协议的套接字一般分为TCP套接字(也叫基于流stream的套接字)和UDP套接字。  TCP/IP协议栈(Stack,层)eg:      应...博文来自:baitxaps的专栏

  前段时间学习了基于TCP协议及duoxiancheng实现服务器与一个客户端或多个客户端之间通信以及客户端之间互相通信...博文来自:ljf_djcrs的博客

  实习期间,项目要求学习MFC编程和SOCKET编程,先写了一个入门的小程序来熟悉一下。服务器的界面图:为了简化,将服务器的IP和Port固定为127.0.0.1和5000【启动】按钮用来启动服务器代码...博文来自:ljh0302的专栏

  由上图可知,TCP的服务端5步就能完成基本功能。TCP客户端3步就能完成基本功能。接下来上基本代码:具体函数的操作等等再讲。(为了使代码步骤更直观,这里不写错误处理语句)//TCP服务器#includ...博文来自:ZJE

  一、实验目的学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:博文来自:why is this

  卷积神经网络是深度学习的基础,但是学习CNN却不是那么简单,虽然网络上关于CNN的相关代码很多,比较经典的是tiny_cnn(C++)、DeepLearnToolbox(Matlab)等等,但通过C语...博文来自:tostq的专栏

  1. 前言 隐马尔科夫HMM模型是一类重要的机器学习方法,其主要用于序列数据的分析,广泛应用于语音识别、文本翻译、序列预测、中文分词等多个领域。虽然近年来,由于RNN等深度学习方法的发展,HMM模型...博文来自:tostq的专栏

  小憩之后,继续为你解读AndFix热修复框架,呵呵。上一篇Alibaba-AndFix Bug热修复框架的使用已经介绍了AndFix的使用,这篇主要介绍AndFix原理以及源码解析。AndFix原理A...博文来自:我是乔同学

  做MFC+opencv项目时,对于我来说,将视频显示到相应控件上(static或者picture)这个问题一直存在,虽然之前写个一个帖子,介绍了一种将opencv的显示window贴到相应控件上的方法...博文来自:沐阳2100的博客

  0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重...博文来自:shiter编写程序的艺术

  帐号相关流程注册范围 企业 政府 媒体 其他组织换句话讲就是不让个人开发者注册。 :)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账...博文来自:小雨同学的技术博客

  1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包...博文来自:专注、专心

  前言:前面几章都是分析MediaCodec相关源码,有收到提问,说MediaCodec到底是硬解码还是软解码?看下今天的Agenda: MediaCodec到底是硬解码还是软解码 MediaMuxer...博文来自:逆流的鱼yuiop

  webService学习(二)—— 调用自定义对象参数 本文主要内容: 1、如何通过idea进行webService Client的简单实现(不再使用wsimport的方式,其实是ide帮我们做了...博文来自:止水的专栏

  灰度图像的自动阈值分割(Otsu 法)机器视觉领域许多算法都要求先对图像进行二值化。这种二值化操作阈值的选取非常重要。阈值选取的不合适,可能得到的结果就毫无用处。今天就来讲讲一种自动计算阈值的方法。这...博文来自:Ivan 的专栏

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...博文来自:我走小路的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  局部异常因子算法-Local Outlier Factor(LOF)在数据挖掘方面,经常需要在做特征工程和模型训练之前对数据进行清洗,剔除无效数据和异常数据。异常检测也是数据挖掘的一个方向,用于反...博文来自:wangyibo0201的博客

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  1. 基本概念     方向导数:是一个数;反映的是f(x,y)在P0点沿方向v的变化率。     偏导数:是多个数(每元有一个);是指多元函数沿坐标轴方向的方向导数,因此二元函数就有两个偏导数。  ...博文来自:MyArrow的专栏

  结果分析(): 1.聚合报告 Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”。今天再次有同行问到这个报告中的各项数据表示什么意思,...博文来自:土的领地 博客

  上一篇文章讲解了SNMP的基本架构,本篇文章将重点分析SNMP报文,并对不同版本(SNMPv1、v2c、v3)进行区别! 四、SNMP协议数据单元 在SNMP管理中,管理站(NMS)和代理(Age...博文来自:假装在纽约

本文链接:http://diverlandya.com/duandianbianma/21.html