套接字

linux 套接字

筅森魡賤 提交于 2019-11-27 02:33:55
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind,但是客户端就不一定了.如果做一个简单的echo服务器的话,那么客户端只直接去connect服务器就可以了. 绑定函数int bind(int socket,const struct sockaddr *address,socklen_t address_len); socket就是socket函数返回的描述字.第二个参数是通用接口!所以如果你的地址结构体用的不是这个,那么一定要有强制转换!!第三个参数是未转换前的地址结构体的大小+1. 返回值0为正常,-1则设置errno表示出错. 绑定之后,就是connect和listen了.开始区分客户端和服务端了. 四.套接字通信模式 首先,通信模式分为两种,TCP和UDP. 前者面向连接,后者则以报文形式发送. 下图是TCP的编程过程. 这是UDP的编程过程. 看完了编程模式,现在再来看具体函数是怎么执行的吧~ 五.流套接字操作 1.connect 原型int connect (int socket,const struct sockaddr *address,socklen_t address_len); 首先这个是用于客户端的

Java网络通信 TCP、UDP

我是研究僧i 提交于 2019-11-27 02:21:52
网络程序设计基础 前言:   这边文章是一篇读书笔记,是我个人在看《Java从入门到精通》(第四版)一书时整理的一个笔记。里面也有借鉴到 https://blog.csdn.net/wyzidu/article/details/83826656 中的相关内容。如果内容涉及侵权,望告知。后面会及时删除。 1.1 局域网与因特网 为了实现两台计算机的通信,必须用一个网络线路连接两台计算机,如下图所示: 1.2 网络协议 啥是网络协议?   网络协议就是规定了计算机之间连接的物理,机械(网线与网卡的连接规定)、电气(有效的电平范围)等特征以及计算机之间的相互寻址规则、数据发送冲突的解决、长的数据如何分段传送与接收等。就像不同国家有不同的法律一样,目前网络协议也有多种。 (1)IP协议   IP是Internet Protocol的简称,它是一种网络协议。Internet网络采用的协议是TCP/IP协议,其全称是Transmission Control Protocol/Internet Protocol。Internet依靠TCP/IP协议,在全球范围内实现不同硬件结构、不同操作系统、不同的网络系统的互联。 TCP/IP模式是一种层次结构,共分为4层,分别为应用层、传输层、网络层和链路层。如下图所示: 1.3 端口和套接字   一般而言,一台计算机只有单一的连到网络的物理连接

【网络编程】 -- 2019-08-11 18:14:44

随声附和 提交于 2019-11-27 00:00:02
原文: http://106.13.73.98/__/1/ 目录 1.socket层 2.理解socket 3.套接字的发展史 4.网络基础 5.socket基本操作 6.socket进阶 7.黏包 8.解决黏包 8.socket的更多方法 1.socket层 ![在这里插入图片描述](http://106.13.73.98/media/ai/2019-03/5ccf086a-baa7-4268-a9f9-a50fb74136b7.png) 2.理解socket socket是应用层与TCP/IP协议族的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个面膜,它把复杂的TCP/IP协议族隐藏在socket接口后面,对于用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。 3.套接字的发展史 套接字起源于20世纪70年代 加利福尼亚 大学伯克利分校版本的Unix,即人们所说的BSD Unix。因此,有时人们也把套接字称为“伯克利套接字”或“BSD套接字”。一开始,套接字被设计用在同一台主机上多个应用程序之间的通讯,这也被称为进程间通讯或IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。 基于文件类型的套接字家族:AF_UNIX unix下一切皆文件,基于文件的套接字调用的就是底层的文件系统来获取数据

网络编程之socket模块

自古美人都是妖i 提交于 2019-11-26 20:57:28
一、TCP协议    TCP是 可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。 二、基于TCP的socket模块   socket通常称为“套接字”,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。   服务端: import socket sk = socket.socket() sk.bind(('127.0.0.1',8090)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)   客户端: import socket sk = socket.socket() # 创建客户套接字 sk.connect(('127.0.0.1',8090)) # 尝试连接服务器 sk.send(b'hello!') ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk

socket 错误之:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

独自空忆成欢 提交于 2019-11-26 20:35:35
出错的代码 #server端 import socket import struct sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() conn,addr=sk.accept() str_len1=struct.unpack('i',conn.recv(4))[0] print(sk.recv(str_len1)) str_len2=struct.unpack('i',conn.recv(4))[0] print(sk.recv(str_len2)) conn.close() sk.close() 问题出在上面标红的地方,这里的sk是套接字所以就出现了OSError: ([WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。)的错误, 解决办法:只需要将sk改成 conn 即可 来源: https://www.cnblogs.com/HByang/p/11332828.html

开发必须懂的网络常识

痞子三分冷 提交于 2019-11-26 20:06:32
1、网络常用概念 网络是应用的灵魂,是所有应用的数据来源.离开了网络,我们的应用就是一潭死水,网络是数据交互的媒介,我们通过网络得到服务器上的数据,也是通过网络给服务器传递数据. 也就是说,网络的实质就 是是交互数据,而数据交互的媒介就是在网络中传输二进制数据流(包括html/图片/视频数据)。 互联网开发的常用概念: 客户端(Client):移动设备(手机/iPad等手持设备),客户端一般就是前端/前台等等.iOS,android开发都是前端开发. 服务器(Server):为客户端提供服务(比如数据/资源等)的机器---本质也是一台计算机(+服务器软件),服务器开发就是后端/后台开发.java/php/.net等. 请求(Request):客户端向服务器索取数据. 响应(Response):服务器对客户端请求做出的反应,一般就是返回数据给客户端. 服务器:按开发阶段来分,分为两种: 远程服务器: 外网服务器.应用上线之后供全体用户使用的服务器.速度取决于用户的网速和服务器的性能. 本地服务器: 内网服务器,测试服务器.开发测试阶段使用的服务器.供内部开发测试人员使用.速度飞快. 2.什么是IP地址 静态IP地址:固定不变的IP地址,需要用户自己手动设置. 动态IP地址:打开计算机后,自动生成的IP地址,不用人为设置。动态的IP地址是通过DHCP协议实现自动获取的。 子网掩码

基于TCP协议的socket套接字编程

倾然丶 夕夏残阳落幕 提交于 2019-11-26 19:57:56
基于TCP协议的socket套接字编程 一、什么是Scoket Scoket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tc/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。 注意:也有人将scoket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip和port的绑定就标识了互联网独一无二的一个应用程序,而程序的pid是同一台机器上的不同进程或者线程的标识。 二、基于TCP协议的套接字编程(简单) 客户端 import socket client = socket.socket() # 拿电话 # 拨电话,指定服务器ip号和端口号 client.connect(('127.0.0.1',8080)) client.send(b'hello world!') # 通信发送信息 data = client.recv(1024) # 接收信息 print(data)

基于UDP协议的socket套接字编程

心已入冬 提交于 2019-11-26 19:57:48
基于UDP协议的socket套接字编程 一、UDP套接字简单示例 UDP不需要经过3次握手和4次挥手,不需要提前建立连接直接发数据就行。所以是无连接的,UDP的sendto不用管是否有一个正在运行的服务端,可以己端一个劲发消息,只不过数据丢失。先启动哪一端都不会报错 recvfrom收的数据小于sendto发送的数据时,在mac和linux系统上会数据直接丢失,在window系统上发送的比接收的大直接报错。 只有sendto发送数据,没有recvfrom接收数据,数据丢失。 UDP协议是数据报协议,发空的时候也会自带报头,因此客户端输入空,服务端也能收到 客户端 import socket client = socket.socket(type=socket.SOCK_DGRAM) server_address = ('127.0.0.1',8080) # 获取服务端的地址 # 循环打印数据 while True: client.sendto(b'hello',server_address) # 使用地址发送数据 data,addr = client.recvfrom(1024) # 接收数据 print('服务端发来的数据',data) # 打印数据 print('服务端的地址',addr) # 打印地址 服务端 import socket server = socket

unix网络编程笔记三

て烟熏妆下的殇ゞ 提交于 2019-11-26 19:30:39
accept函数 #include<sysy/socket.h> int socket(int family,int type,int protocol); 使用这个函数创建一个套接字,函数执行成功返回一个套接字描述符,套接字描述符是一个小的整形数据,第一个参数表示地址族,第二个参数为套接字类型,第三个参数使用0来自适应前两个参数。 family的取值 AF_INET表示IPv4 AF_INET6表示IPv6 AF_LOCAL表示unix域协议 AF_ROUTE表示路由协议 AF_KEY表示秘钥协议 type的取值 SOCK_STREAM表示流式套接字 SOCK_DGRAM表示数据报套接字 SOCK_RAW表示原始套接字 函数成功返回文件描述符,失败返回-1。 connect函数 #include<sys/socket.h> int connect(int sockfd,struct sockaddr *seraddr,socklen_t addrlen); 函数执行成功返回0,失败返回-1 如果使用的是TCP协议,则这个函数的执行动作是三次握手,主动和服务器进行连接,这个函数是阻塞的,当成功或者出错时返回。 当是一个TCP连接会出现以下几种错误情况 返回ETIMEDOUT错误,这个错误表示没有收到服务器端对SYN的响应,当客户端向服务器发送SYN时没有收到回应便会隔一段时间再发

socket阻塞与非阻塞,同步与异步【转】

岁酱吖の 提交于 2019-11-26 18:31:43
原文: socket阻塞与非阻塞,同步与异步 作者: huangguisu 1. 概念理解 在进行网络编程时,我们常常见到 同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock) 四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 也就是必须一件一件事做 , 等前一件做完了才能做下一件事。 例如普通 B/S 模式(同步):提交请求 -> 等待服务器处理 -> 处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 例如 ajax请求( 异步) : 请求通过事件触发 -> 服务器处理(这是浏览器仍然可以作其他事情) -> 处理完毕 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在s ocket 中调用r ecv 函数,如果缓冲区中没有数 据,这个函数就会一直等待,直到有数据才返回。而此时