LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 929|回复: 10

如何实现一个linux下的通信软件或有没现成的软件

[复制链接]
发表于 2005-4-1 19:06:05 | 显示全部楼层 |阅读模式
有没有linux下的类似的通信软件:
1.相当于一个后台运行的模块,单独处理网络中的数据交换供上层应用
2占用较少大cpu资源
3.实现多线程提高效率
请各位指点下。。。
发表于 2005-4-1 20:00:39 | 显示全部楼层
inetd/xinetd就能满足你的要求了吧。

举个例子吧:
写个这样的c程序:
#include <stdio.h>
int main(){
  printf("Hello");
}
编译成hello,放到/usr/local/bin下面
然后修改/etc/services,
添加:
hellop          12345/tcp
然后修改/etc/inetd.conf
添加:
hellop   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/local/bin/hello
然后/etc/init.d/inetd restart
然后telnet localhost 12345看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-1 20:47:14 | 显示全部楼层
谢谢楼上的兄弟,如你所说,你有关于xinetd/inetd的资料吗?
我的意思是实现一个这样负责底层数据通信的模块,那我是不是要实现xinetd这个软件的部分功能,这个难度有多大?
回复 支持 反对

使用道具 举报

发表于 2005-4-1 23:00:29 | 显示全部楼层
Post by tcww88
谢谢楼上的兄弟,如你所说,你有关于xinetd/inetd的资料吗?
我的意思是实现一个这样负责底层数据通信的模块,那我是不是要实现xinetd这个软件的部分功能,这个难度有多大?

这个说法好笼统,到底是实现怎样的通信,为上层提供怎样的服务?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-2 00:49:20 | 显示全部楼层
就是说,这个通信模块在一个端口监听,有数据传送过来,则负则将其收集起来或发送,以备上层的应用软件(负责对接收数据的处理,主要占用cpu资源)调用,主要起数据收集发送的作用。
通信模块在工作期间负责底层的全部数据交换,不需要上层应用程序的干涉,是一个相对独立的模块;
而且不能占用太多的cpu资源可以考虑多线程;

恳请兄弟们更正指点。。。。
回复 支持 反对

使用道具 举报

发表于 2005-4-2 11:25:11 | 显示全部楼层
这样说来好像很简单,就是创建一个线程及发送接收的缓冲区,那个线程以阻塞方式接收网上传来的数据,放到缓冲区等着上层程序(创建线程的程序)来取,发送类似。比如实现几个函数:

module_open, module_read, module_write, module_close

open的时候创建线程和缓冲区;read、write时读写缓冲区,这里要考虑线程间的同步与互斥;close时结束线程,释放缓冲区。最终让调用这些函数的上层程序感觉不到有另一个线程的存在。是不是这个意思?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-2 12:42:45 | 显示全部楼层
谢谢楼上,我想最简单的实现应该是象你说的这样的,
可是现在我还有点疑问,就是用什么来实现这些动作,
用socket是查询方式的,似乎效率不高,
除了socket我又不知到有什么别的实现方法,
请问楼上的兄弟有没有实现这些功能方面的资料,
我刚开始接触这些东西,感觉很迷茫,找不到切入点,
恳请兄弟指点!谢谢!
回复 支持 反对

使用道具 举报

发表于 2005-4-2 23:08:36 | 显示全部楼层
资料主要还是看 socket 和 多线程编程 方面的。

用 socket 不见得是查询方式的,看你怎么用。

默认情况下 read 时没有收到东西是阻塞的(使通信线程阻塞而上层应用所在线程继续运行),这正是保证效率的一种方法。

另,你的通信模块应该提供的是一种比 TCP/IP 更高层的服务,否则这样做意义不大。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-8 12:35:03 | 显示全部楼层
doubleelec兄:感谢你的耐心细致的回复,
这几天看了下linux下的网络结构部分,又根据我这个软件的要求,对于接收部分,不能老有个进程在那里监听,这样挺费资源的,按现在的想法,我想可以做到设备驱动层,相当与网卡驱动程序,这样就能使用硬件中断,不需要端口监听了,同时用双指针循环队列做缓冲池储存数据。这样在数据接收到一定程度就可设定一个标识符通知上层程序取回数据。应用程序只需查询这个标识符即可。
现在的问题是:
1.应用程序通过查询标识符来接收数据是否比socket的监听更有效率,隔多长时间查询比较合适,
2.对于数据如何进行流量控制防止缓冲区被新到数据覆盖,普通的网卡驱动的流控都是有系统解决的,驱动程序本身不进行处理。
不知doubleelec兄等对此有什么看法
ps:发现doubleelec兄对网络程序设计部分很熟,多多指教,搬个板凳等待。。。。。。
回复 支持 反对

使用道具 举报

发表于 2005-4-8 12:53:03 | 显示全部楼层
根据你目前的描述,看不出有做一个驱动程序的必要,“硬件上是否用了中断机制”与“把你的通信模块实现在应用程序的层次还是驱动程序的层次”之间没有必然的联系。

至于要不要流量控制和差错控制还言之尚早,现在首先要明确的问题是:

你的通信模块要向应用程序提供什么功能?

你的应用程序是干什么的,为什么不直接调用socket实现通信功能而要使用这样的一个通信模块?

你大概有必要再学习一下计算机网络及TCP/IP的基本原理。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表