Linux网络编程发送结构体类型数据(linux 结构)
在Linux系统中数据如何发送?
从网络设备驱动程序的结构分析可知,Linux网络子系统在发送数据包时,会调用驱动程序提供的hard_start_transmit()函数,该函数用于启动数据包的发送。在设备初始化的时候,这个函数指针需被初始化以指向设备的xxx_tx ()函数。网络设备驱动完成数据包发送的流程如下:
1)网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。
2)对于以太网,如果有效数据的长度小于以太网冲突检测所要求数据帧的最小长度ETH ZLEN,则给临时缓冲区的末尾填充0。
3)设置硬件的寄存器,驱使网络设备进行数据发送操作。
特别要强调对netif_ stop_queue()的调用,当发送队列为满或因其他原因来不及发送当前上层传下来的数据包时,则调用此函数阻止上层继续向网络设备驱动传递数据包。当忙于发送的数据包被发送完成后,在以TX结束的中断处理中,应该调用netif_wake_queue ()唤醒被阻塞的上层,以启动它继续向网络设备驱动传送数据包。当数据传输超时时,意味着当前的发送操作失败或硬件已陷入未知状态,此时,数据包发送超时处理函数xxx _tx _timeout ()将被调用。这个函数也需要调用由Linux内核提供的netif_wake _queue()函数以重新启动设备发送队列。
linux下socket编程,怎样把文件和文件属性一起发送到服务器端
socket可以发送任意类型的数据。socket本身不限制你要发送什么,而是由你自己来定要发什么的。只要你接收端能识别发来的是什么即可。
协议的三个基本要素,语法、语义、同步。比如你用于表示文件属性的结构体或者其他什么数据长度固定是20字节,那么你就在发送文件内容之前把这20字节发送过去,接收端在接收内容之前,固定会先接收20字节并作为文件属性,随后接收到的内容才作为数据存入文件,这样就可以做到了。
关键点就在于自己要定好语法、语义、同步这些,发送端和接收端配合好动作。
linux开发板怎么直接发送网络数据
需要从网络协议初始化开始分析。
网络协议初始化:所在文件net/ipv4/af_inet.cstatic int _init inet_init(void),上面接口将初始化ipv4相关协议,socket模块初始化:所在文件net/socket.c。
数据包发送调用流程:
1、tcp_sendmsg(tcp_ipv4.c)将应用层数据创建成数据skb包;
2、tcp_push_one(tcp_output.c)、tcp_push(tcp_output.c)、tcp_push_pending_frames(tcp_output.c);
3、tcp_write_xmit(tcp_output.c);
4、tcp_transmit_skb(tcp_output.c)。
该接口主要功能:添加tcp头,通过icsk-icsk_af_ops-queue_xmit调用ip层发送接口。