初学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 ...
随机推荐
- 对oracle用户创建asm磁盘
--root用户执行vi /etc/sysctl.conf #Install oracle settingfs.aio-max-nr = 1048576fs.file-max = 6815744#ke ...
- Unity iOS Appstore 上架的问题
之前一直是一个人的名义上架的应用.现在变成:公司的账号就会出现一些莫名的问题: 首先是账号需要新的boulder名字,新建之后下载验证key. 注意:真机测试不发布,选择自动签名就行了:需要发布就取消 ...
- Typescript---02 变量声明
声明变量: let和const是JavaScript里相对较新的变量声明方式.let在很多方面与var是相似的,但是可以避免在JavaScript里常见一些问题. const是对let的一个增强,它能 ...
- linux 大杂烩
1.linux mysql输错命令 mysql命令行中执行多行命令时,如果前边输入的命令发生错误,是很令人头疼的事情,可以通过输入\c来取消前边的输入,重新进入“mysql->”提示符. 2.l ...
- python3.0j基语法-01
python基础语法,字符编码,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) print("Hello word") 一个简单hello ...
- python绘制等边三角形
定义一个函数,参数为三角形的边长和颜色,并调用该函数绘制两个边长颜色不同的等边三角形 def draw(l,color): import turtle turtle.setup(900,600,200 ...
- spring boot 配置 fastjson 替代 Jackson (并解决返回字符串带双引号问题)
注:以我遇到的情况,只要发出的请求参数是map格式的,都会在前后多加一个双引号 以下代码有两个功能:1.FastJson 替换 Spring 自带的 Jackson 2.解决返回的字符串带双引号问题 ...
- PDF文件优缺点
PDF的优点: 一般公司的公文档都是用PDF格式传递给员工,因为PDF可防止他人无意中触到键盘修改文件内容. 再有就是,当我们将毕业设计报告用word编辑后,发送给导师查看时,也建议采用PDF格式.因 ...
- [OC] 各型号iPhone的屏幕分辨率与开发使用的数值
- MVC简单的增删改查
最近的学习了一下mvc,现在做一个mvc的CRUD例子. 1.创建实体模型 2.创建一个UserInfo的控制器 3.查询数据 code public IList<UserInfo> us ...