首页 > 文章中心 > 正文

LINUX系统网络通信探索

LINUX系统网络通信探索

LINUX网络通信设计

下面我将对LINUX平台下网络通信设计的工作流程、数据发送、数据接收三个模块进行详细的介绍。

1工作流程

首先调用SOCKET函数创建一个用于通信的套接字,然后给已经创建的套接字(SOCKET)绑定本地地址/端口号(Bind()),成功之后就在相应的SOCKET上监听(Listen())。当Accept()函数捕捉到一个连接服务(Connect())请求时,接受并生成一个新的SOCKET,并通过这个新的SOCKET与客户端连接,用Read()/Write()或相关函数读取和发送数据,传输完毕时,用Close()关闭所有进程,结束这次通信。客户端程序设计流程:客户端也先要创建一个SOCKET,将该SOCKET与本地地址/端口号绑定,还需要指定服务器端的地址与端口号,随后向服务器端发出连接(Connect())请求,请求被服务器端接受后,用函数进行了数据的接收与发送,传输完毕后,用Close()关闭套接口,通信结束。

2数据发送模块

从应用层到物理层发送数据时,函数调用顺序如下:send>sys—send>sys—sendto>sock—sendmsg>inet—sendmsg>tcp—sendmsg>tcp—send—skb>tcp_transmit>ip—queue—xmit>ip—queue—xmit2>ip—output>ip—finish—output>ip—finish—output2>neigh_resolve_output>dev_queue_xmit>ei—start_xmit网络连接创建好以后,就可以进行发送数据了。

3数据接收模块

当网络上的数据到达接收计算机时,网卡控制器产生中断,调用该中断的中断处理程序ei—interrupt()。在这个函数中主要通过判断中断状态寄存器(ISR)的内容,调用相应的处理程序来接收数据。如果中断状态寄存器显示接收到数据或者接收到有错误的数据时,就调用ei—receive()函数进行数据的接收。在ei—receive()函数中要正确设定边界指针寄存器(BNRY)和当前页寄存器(CPR)的内容,当BNRY或者CPR等于页停止寄存器(PSTOP)时,把它们的内容设置成页开始寄存器(PSTART).当CPR=BNRY时,表示缓冲区全部被存满,数据没有被用户读走,这时网卡将停止往内存写数据,新收到的数据包将被丢弃不要,而不覆盖旧的数据;当CPR=BNRY+1时,表示网卡的接收缓冲区里没有数据,用户通过这个判断知道没有包可以读,当CPR!=BNRY+1时,表示接收到新的数据包。

结束语

LINUX操作系统在网络应用方面具有很强的开发潜力,同时LINUX也是可靠性、安全性非常高的系统,因此在基于LINUX平台借助于SOCKET端口进行网络通信的研究具有广泛的应用价值和前景。

作者:丁思强单位:黑龙江八一农垦大学信息技术学院

文档上传者