recv

记一次传递文件句柄引发的血案 (续)

风流意气都作罢 提交于 2020-01-06 17:38:12
继 记一次传递文件句柄引发的血案 之后,这个 demo 又引发了一次血案,现录如下。 这次我是在 linux 上测试文件句柄的传递,linux 上并没有 STREAMS 系统, 因此是采用 unix domain socket 的 sendmsg/recvmsg 中控制消息部分来传递句柄的。 代码的主要修改部分集中于发送 fd 与接收 fd 处,一开始代码是这样的,运行良好。 spipe_fd.c 1 #define MAXLINE 128 2 #define RIGHTSLEN CMSG_LEN(sizeof(int)) 3 #define CREDSLEN CMSG_LEN(sizeof(struct CREDSTRUCT)) 4 #define CONTROLLEN (RIGHTSLEN+CREDSLEN) 5 6 int send_fd (int fd, int fd_to_send) 7 { 8 struct iovec iov[1]; 9 struct msghdr msg; 10 struct cmsghdr *cmptr = NULL; 11 char buf[2]; 12 13 iov[0].iov_base = buf; 14 iov[0].iov_len = 2; 15 16 msg.msg_iov = iov; 17 msg.msg_iovlen = 1;

RECV buffer empty, but returns a value > 1

感情迁移 提交于 2020-01-06 14:10:44
问题 I am attempting to make a simple server so that two clients can communicate with each other. The main server code accepts the two client connections and then forks off a process that uses execl to generate a personal server between the two clients so that the main server can continue looking for new connections. Everything seems to work correctly until the personal server attempts to contact the clients and they both receive gibberish, if anyone knows what could cause this please let me know.

RECV buffer empty, but returns a value > 1

微笑、不失礼 提交于 2020-01-06 14:08:28
问题 I am attempting to make a simple server so that two clients can communicate with each other. The main server code accepts the two client connections and then forks off a process that uses execl to generate a personal server between the two clients so that the main server can continue looking for new connections. Everything seems to work correctly until the personal server attempts to contact the clients and they both receive gibberish, if anyone knows what could cause this please let me know.

网络编程之TCP客户端开发和TCP服务端开发

我的未来我决定 提交于 2020-01-06 03:15:35
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': # 创建tcp客户端套接字 # 1. AF_INET:表示ipv4 # 2. SOCK_STREAM: tcp传输协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 和服务端应用程序建立连接 tcp_client_socket.connect(("192.168.131.62", 8080)) # 代码执行到此,说明连接建立成功 # 准备发送的数据 send_data = "你好服务端,我是客户端小黑!".encode("gbk") # 发送数据 tcp_client_socket.send(send_data) # 接收数据, 这次接收的数据最大字节数是1024 recv_data = tcp_client_socket.recv(1024) # 返回的直接是服务端程序发送的二进制数据 print(recv_data) # 对数据进行解码 recv_content = recv_data.decode("gbk") print("接收服务端的数据为:", recv_content) #

zeromq源码分析笔记之线程间收发命令(2)

时光毁灭记忆、已成空白 提交于 2020-01-03 02:40:56
在 zeromq源码分析笔记之架构 说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由 command_t结构体确定 ;另一类是socket_base_t实例与session的消息通信,消息的结构由 msg_t确定。命令的发送与存储是通过mailbox_t实现的,消息的发送和存储是通过pipe_t实现的,这两个结构都会详细说到,今天先说一下线程间的收发命令。 zeromq的线程可分为两类,一类是io线程,像reaper_t、io_thread_t都属于这一类,这类线程的特点就是内含一个轮询器poller及mailbox_t, 通过 poller 可以 监听激活 mailbox_t的 信号 ;另一类是zmq的socket,所有socket_base_t实例化的对象都可以看做一个单独的线程,这类线程不含poller,但同样含有一个mailbox_t,可以用于收发命令,由于不含poller,只能在每次使用socket_base_t实例的时候先处理一下mailbox_t,看是否有命令需要处理,代码上来看就是每次先调用下面这个函数接收并处理一下命令: int zmq::socket_base_t::process_commands (int timeout_, bool throttle_) 另外

python套接字解决tcp粘包问题

流过昼夜 提交于 2020-01-02 21:20:00
python套接字解决tcp粘包问题 目录 什么是粘包演示粘包现象 解决粘包 实际应用 什么是粘包 首先只有tcp有粘包现象,udp没有粘包 socket收发消息的原理 发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。 例如基于tcp的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看了,根本不知道该文件的字节流从何处开始,在何处结束 粘包问题的根源 所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。 此外,发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率

How does the python socket.recv() method know that the end of the message has been reached?

巧了我就是萌 提交于 2020-01-01 10:03:14
问题 Let's say I'm using 1024 as buffer size for my client socket: recv(1024) Let's assume the message the server wants to send to me consists of 2024 bytes. Only 1024 bytes can be received by my socket. What's happening to the other 1000 bytes? Will the recv-method wait for a certain amount of time (say 2 seconds) for more data to come and stop working after this time span? (I.e., if the rest of the data arrives after 3 seconds, the data will not be received by the socket any more?) or Will the

RTT学习之SPI设备

二次信任 提交于 2019-12-31 04:35:25
SPI 分为主、从、设备;具体又分标准SPI/DUAL SPI/QUAD SPI(用80字节的RAM rt_err_t rt_spi_take_bus(struct rt_spi_device *device); 代替收发寄存器) 从设备的操作:在多线程通讯中,从机需要先获得SPI总线、CS使能;使用完后再分别释放,从而使其它获得控制权。 rt_err_t rt_spi_take_bus(struct rt_spi_device *device); rt_err_t rt_spi_take(struct rt_spi_device *device); rt_err_t rt_spi_release(struct rt_spi_device *device); rt_err_t rt_spi_release_bus(struct rt_spi_device *device); void rt_spi_message_append (struct rt_spi_message * list, struct rt_spi_message *message);//单链表发送一条消息 二 主设备的操作: 2.1 先挂载已经注册好的SPI设备, rt_err_t rt_spi_bus_attach_device(struct rt_spi_device *device, const char

关于 recv函数()函数

依然范特西╮ 提交于 2019-12-28 03:17:26
int recv( SOCKET s, char FAR *buf, int len, int flags); (1)recv先等待s的发送缓冲中的数据被协议传送完毕, 如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR, (2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后, recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据, 那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就 把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以 在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。 recv函数仅仅是copy数据,真正的接收数据是协议来完成的), (3) recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR; 如果recv函数在等待协议接收数据时网络中断了,那么它返回0。 */ 12345678910111213 int CSocketEX::RecvCommand(SOCKET socket,char* buf,int bytes) { char* szRecv =(char*)buf; while(bytes > 0) { int nRet =

37 - 网络编程-UDP编程

别说谁变了你拦得住时间么 提交于 2019-12-27 09:13:46
目录 1 UDP协议 2 UDP通信流程 3 UDP编程 3.1 构建服务端 3.3 常用方法 4 聊天室 5 UDP协议应用 1 UDP协议 UDP是面向无连接的协议, 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包 。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。 2 UDP通信流程 我们先来了解一下,python的socket的通讯流程: 服务端: 创建Socket对象 绑定IP地址Address和端口Port,使用bind方法,IPv4地址为一个二元组('IP',Port), 一个UDP端口只能被绑定一次 接受数据,recvfrom方法,使用缓冲区接受数据 发送数据,sendto方法,类型为bytes 关闭连接 客户端: 创建Socket对象 连接服务端。connect方法(可选) 发送数据,sendto/send方法,类型为bytes 接受数据,recvfrom/recv方法,使用缓冲区接受数据 关闭连接 我们可以看到UDP不需要维护一个连接,所以比较简单 3 UDP编程 使用udp编程和使用tcp编程用于相似的步骤,而因为udp的特性,它的服务端不需要监听端口,并且客户端也不需要事先连接服务端。根据上图,以及建立服务端的流程