recvfrom

Why the bytes stream got by python socket.recvfrom is different from that crawled by WireShark?

怎甘沉沦 提交于 2019-12-24 18:39:37
问题 I used the python socket to send a DNS query packet socket and listen to the response. Finally, I got a DNS response packet by the socket.recvfrom(2048) function as expected. But strangely, where I compared the response packet with the packet crawled by Wireshark, I found there exists many difference. The differences would be found as 3f at the second picture. The DNS response packet (The highlighted part) crawled by the Wireshark The DNS response packet got by the socket.recvfrom(2048) The

[网络通信与协议]TCP与UDP

自作多情 提交于 2019-12-24 03:52:01
TCP与UDP TCP与UDP的区别 TCP与UDP基本区别 具体编程时的区别 编程区别 编程步骤的区别 TCP TCP编程的服务器端一般步骤是 TCP编程的客户端一般步骤是 UDP UDP编程的服务器端一般步骤是 UDP编程的客户端一般步骤是 UDP应用场景 TCP与UDP的区别 tcp比较可靠、不容易粘包、不容易丢包 udp操作简单、传输速度比较快 TCP与UDP基本区别 1.基于连接与无连接 2.TCP要求系统资源较多,UDP较少; 3.UDP程序结构较简单 4.流模式(TCP)与数据报模式(UDP); 5.TCP保证数据正确性,UDP可能丢包 6.TCP保证数据顺序,UDP不保证 具体编程时的区别 1.socket()的参数不同 2.UDP Server不需要调用listen和accept 3.UDP收发数据用sendto/recvfrom函数 4.TCP:地址信息在connect/accept时确定 5.UDP:在sendto/recvfrom函数中每次均需指定地址信息 6.UDP:shutdown函数无效 7.UDP不需要经过三次握手与四次挥手的过程 编程区别 通常我们在说到网络编程时默认是指TCP编程 SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据

深入了解Netty【四】IO模型

匆匆过客 提交于 2019-12-21 02:55:36
引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。 因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。 名词概念 阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。 非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。 同步:指向被调用方,被调用方得到结果后再返回给调用方。 异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。 recvfrom函数:系统调用,经socket接收数据。 5中IO模型 1、阻塞式IO模型(blocking I/O) 进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。 2、非阻塞式IO模型(non-blocking I/O) 进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。 3、IO复用模型(I/O multiplexing) 进程调用select,如果没有套接字变为可读,则阻塞,直到有可读套接字之后,调用recvfrom函数,返回结果。 4、信号驱动式IO模型(signal-driven I/O) 进程先注册信号驱动,之后进程不阻塞,当数据准备好后

Linux 中的IO 模型

自闭症网瘾萝莉.ら 提交于 2019-12-20 00:24:20
IO分类 BIO 同步阻塞 NIO 同步非阻塞 AIO 异步非阻塞 Linux 中的IO 模型 用户空间与内核空间: 内核空间是指操作系统的内核,独立于其他的用户进程,有权限访问系统的底层的所有的硬件设备. 用户空间:其他的应用程序,这些应用程序不能直接访问系统的重要文件和设备,必须通过内核空间来间接的访问. 这样设计会更加的安全,一般4g的内存 1G是内核空间 3G是用户空间. 所有的进程都是在内核的支持下运行的. 内核可以控制一个在cpu运行的进程挂起, 也可以让等待的进程 阻塞 I/O ( blocking IO ) 在 linux 中,默认情况下所有的 socket 都是 blocking ,一个典型的读操作流程大概是这样: 当用户进程调用了 recvfrom 这个系统调用, kernel 就开始了 IO 的第一个阶段:准备数据(对于网络 IO 来说,很多时候数据在一开始还没有到达。比如,还没有收到一个完整的 UDP 包。这个时候 kernel 就要等待足够的数据到来)。这个过程需要等待,也就是说数据被拷贝到操作系统内核的缓冲区中是需要一个过程的。而在用户进程这边,整个进程会被阻塞(当然,是进程自己选择的阻塞)。当 kernel 一直等到数据准备好了,它就会将数据从 kernel 中拷贝到用户内存,然后 kernel 返回结果,用户进程才解除 block 的状态

C sockets send UDP and process ICMP reply from router

[亡魂溺海] 提交于 2019-12-19 04:50:27
问题 I'm trying to send a UDP packet to a router with a time to live of 1, to then receive an ICMP time exceeded reply. So far I'm able to send the packet, but when my program gets to the recv part of the execution, it just hangs. I have an error check for recvfrom, but it doesn't even get to that. My computer is receiving the request. I know this because I run Wireshark when I run the program and I filter for ICMP requests. Every time I run the program, I receive the reply. What am I doing wrong

【Python3之socket编程】

末鹿安然 提交于 2019-12-17 21:50:06
一、socket的定义   Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。 补充:也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序,而程序的pid是同一台机器上不同进程或者线程的标识 二、套接字发展史及分类   套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX

UDP 套接字 recvfrom & sendto

时光总嘲笑我的痴心妄想 提交于 2019-12-17 03:06:46
UDP编程中,服务器不接受来自客户端的连接,只管调用recvfrom函数,阻塞等待客户端的连接。 UDP都是以数据报的形式进行发送和接收的,而TCP是以数据流的形式进行发送和接收的。 客户服务流程结构如下: recvfrom和sendto函数 函数定义: int sendto (int s, const void *buf, int len, unsigned int flags, const struct sockaddr *to, int tolen); int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); 函数说明: sendto(),是把UDP数据报发给指定地址; recvfrom()是从指定地址接收UDP数据报。 参数: s: socket描述符。 buf: UDP数据报 发送/接收 缓存地址。 len: UDP数据报长度。 flags: 该参数一般为0。 to: sendto()函数参数,struct sockaddr_in类型,指明UDP数据发往哪里报,手动填充对端数据。 tolen: 对方地址长度,一般为:sizeof(struct sockaddr_in)。 from: recvfrom()函数参数,struct

python网络编程:UDP方式传输数据

牧云@^-^@ 提交于 2019-12-14 21:48:08
UDP --- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议。 UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。 由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 开发环境:linux下pycharm3.5 测试:使用terminal终端测试 使用 nc -u ip 端口 进行测试客户端 使用 nc -lu ip 端口 进行测试服务器端 1.udp服务器端接受一次数据 import socket # 设置服务器默认端口号 PORT = 9002 # 创建一个套接字socket对象,用于进行通讯 # socket.AF_INET 指明使用INET地址集,进行网间通讯 # socket.SOCK_DGRAM 指明使用数据协议,即使用传输层的udp协议 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) address = ("", PORT) # 为服务器绑定一个固定的地址,ip和端口 server_socket.bind(address) # 接收客户端传来的数据 recvfrom接收客户端的数据,默认是阻塞的,直到有客户端传来数据 #

recvfrom re-reading data on socket

女生的网名这么多〃 提交于 2019-12-11 18:19:56
问题 I'm creating a simple server/client UDP socket program and I've run into a problem. The problem is that the recvfrom() function keeps on re-reading the last data that was sent. So if I send two packets from the client to the server then recvfrom() will read the first packet and print its data then it will constantly read the second packet over and over again. As I understand it the packet should be removed from the socket once a successful read operation has been performed, but that doesn't

socket python : recvfrom

北慕城南 提交于 2019-12-10 18:43:12
问题 I would like to know if socket.recvfrom in python is a blocking function ? I couldn't find my answer in the documentation If it isn't, what will be return if nothing is receive ? An empty string '' ? In the other case, if in fact, it is blocking, how can i do to put it as an unblocking function ? I heard about settimeout but I don't know if it is actually the right solution. 回答1: By default it is blocking. It can be turned into non-blocking via socket.setblocking(0) or (equivalently) socket