初学Socket通信
1.Socket:Socket就是套接字。客户端与服务器之间通信用的。Socket接口是TCP/IP网络的API.
2.SYN是TCP/IP建立连接时使用的握手信号。在客户端和服务器之间建立正常的TCP网络连接时,客户端首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到这个消息,最后客户端再以ACK消息响应。这样在客户端和服务器之间才能建立起可靠的TCP连接,数据才可以在客户端和服务器之间传递。
3.ACK即确认字符,在数据通信中,接收站给发送站的一种传输类控制字符。表示发来的数据已确认接受无误。
4.网络中进程之间的通信,首要解决的是如何标识一个进程,否则无从谈起!TCP/IP协议帮我们解决了这个问题,网络层的ip地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址、协议、端口)就可以标识网络的进程了,进程通信就利用这个标志与其他进程进行交互。TCP/IP采用编程接口是socket(套接字)。
5.socket的基本操作:“open-write/read-close”模式
流程:①socket()
②bind()
③listen()、connect()
④accept()
⑤read()、write()
⑥close()
6.socket()函数
int socket(int domain,int type,int protocol);
socket()用于创建一个socket描述符,传入不同参数,创建不同的socket描述符。
参数:
domain:协议域,决定了socket的地址类型;
type:指定socket类型;
protocol:协议(如TCP、UDP、STCP、TIPC)
socket()创建一个socket时,返回的socket描述子存在于协议域空间中,但是没有一个具体的地址。如果想要给它赋值一个地址,必须调用bind()函数,否则当调用connect()、listen()时系统会自动随机分配一个端口。
7.bind()函数
int bind(int sockfd,const struct sockaddr *addr,socklen_t adddrlen);
参数:
sockfd:bind()就是将给这个描述字绑定一个名字;
addr:一个const struct sockaddr*指针,指向要绑定给sockfd的协议地址。这个地址结构根据创建socket时的地址协议族的不同而不同。
8.listen()、connect()函数
服务器在调用socket()、bind()之后就会调用listen()来监听这个socket,客户端调用connect()发出连接请求,服务端就会接收这个请求
int listen(int sockfd,int backlog);
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);
参数:
listen函数的第一个参数是要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是主动类型的,listen()将socket变为被动类型的,等待客户的连接请求。
connect函数的第一个参数即为客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。
9.accept()函数
TCP服务端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求后,就会调用accept()函数接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了。
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
accept函数的第一个参数为服务器的socket描述字,第二个为指向struct sockaddr*的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accept成功,那么返回值是有内核自动生成的一个全新的描述字,代表与返回客户的TCP连接。
注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,成为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器同城仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个有服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。
10.read()、write()等函数
服务器与客户建立好连接,就可以调用网络I/O进行读写操作了,实现网络中不同进程之间的通信!
①read()/write()
②recv()/send()
③readv()/writev()
④recvmsg()/sendmsg()
⑤recvfrom()/sendto()
read函数是负责从fd读取内容,read返回实际所读的字节数,如果返回的值是0表示已经读到文件的结束了,小于0表示出现了错误。如果错误为eintr说明读是由中断引起的,如果是econnrest表示网络连接出了问题。
write函数将buf中的字节内容写入文件描述符fd.成功时返回写的字节数。失败时返回-1,并设置errno变量。在网络程序中,当我们向套接字文件描述符写时有两种可能:①write返回值大于0表示写了部分或者是全部数据。②返回值小于0,此时出现了错误,错误为eintr表示在写的时候出现了中断错误。如果为epipe表示网络连接出现了问题(对方已经关闭了连接)
11.close()函数
int close(int fd)
close函数操作只是使相应socket描述字的应用计数-1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。
12.socket中TCP的三次握手建立连接
①客户端向服务器发送一个SYN J(握手信号)
②服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1;
③客户端再向服务器发一个确认ACK K+1;
初学Socket通信的更多相关文章
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
随机推荐
- SQL语句case when then的用法
case具有两种格式.简单case函数和case搜索函数. //简单case函数 case sex when '1' then '男' when '2' then '女’ else '其他' end ...
- OPPO F9 Pro在哪里打开usb调试模式的完美方法
经常我们使用pc通过数据线连接到安卓手机的时候,如果手机没有开启USB调试模式,pc则没能够成功读到我们的手机,此情况我们需要找处理方法将手机的USB调试模式开启,今天我们介绍OPPO F9 Pro如 ...
- .net基础学java系列(一)视野
本文目的在于扩展你我视野,求各位大神帮忙补充下表格中的内容,特别是Java的相关内容. 下面的文字纯是为了凑足150个字. 本人作为一名普通的.net程序员,也快混了十年了.在.net方面的知识面较广 ...
- Jmeter(1)介绍
JMeter是什么东西 Jmeter(Apache JMeter)是一个100%基于JAVA的应用程序,它的功能是 分析和衡量 web应用程序和各种服务的性能和负载能力 Jmeter不是一个浏览器,它 ...
- django信号
什么是信号? 信号是在某个操作前或后自动触发一些操作. 信号是通知,是一种状态,相当于在某种状态下发特定的消息 --为了实现代码层解耦 村长博客:http://www.cnblogs.com/legu ...
- Oracle体系结构之内存结构(3)
Oracle内存结构由系统全局区SGA和程序全局区PGA组成. SGA是实例启动的时候分配的Oracle实例中的一个基本成分. PGA是服务器进程启动时分配. 1.系统全局区SGA 系统全局区SGA由 ...
- 在.Net Core WebAPI下给Swagger增加导出离线文档功能
一丶前言 最近刚接触到Swagger,在github上下载了它的源码和demo学习了一遍,发现这个组件非常好用,不过不足的是它没有导出离线文档的功能,于是乎我就想给它加一个导出功能 Swagger G ...
- Web程序-----批量生成二维码并形成一张图片
需求场景:客户根据前台界面列表所选择的数据,根据需要的信息批量生成二维码并形成一张图片,并且每张图片显示的二维码数量是固定的,需要分页(即总共生成的二维码图片超出每页显示的需另起一页生成),并下载到客 ...
- LCT入门总结
原文链接https://www.cnblogs.com/zhouzhendong/p/LCT.html 为什么要写这个总结? 因为之前的总结出问题了…… 下载链接: LCT 入门总结 UPD(2019 ...
- 实验一《Java开发环境的熟悉》实验报告
(一)基础操作 实验要求: 1 .建立"自己学号exp1"的目录 2 .在"自己学号exp1"目录下建立src,bin等目录 3 .javac,java的执行在 ...