QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 970|回复: 6

怎样用socket编程

[复制链接]
发表于 2004-3-10 18:49:09 | 显示全部楼层 |阅读模式
我写了一个socket客户端,但是我必须一直查询是否有数据传入。能否有一种方式可以在有数据传入的时候通知我来接收?
发表于 2004-3-10 20:55:13 | 显示全部楼层
用非阻塞方式(这时由操作系统为你等待,有数据时会通知你,不过较为占用CPU资源)。不知有无误会你的意思?如果这是你想要的,那麻烦你再看一看Unix Network Programming---W.Richard Stevens Chapter6,15。
回复

使用道具 举报

发表于 2004-3-11 13:20:36 | 显示全部楼层
我想楼主需要的是阻塞方式的吧?
回复

使用道具 举报

发表于 2004-3-14 16:28:51 | 显示全部楼层
对不起,用非阻塞方式是错误的。谢谢sjinny的提醒。

不过我认为信号驱动方式可以做到。首先,你注册一个SIGIO信号,将socket标志置为信号驱动方式。再注册对应SIGIO的信号处理函数,比如deal_sigio。这样你就可以继续做其它的事。当有数据到来,会触发一个SIGIO信号,系统调用deal_sigio。在deal_sigio中,你应该调用相应的接收函数(如UDP的recvfrom)去取数据,注意,这时你先在执行的这个进程被阻塞了。虽然你的进程还是会被信号处理函数阻塞,但性能要好多了,是吧?

还有,SIGIO的触发是一个复杂的事情。在UDP中较为简单,只要有数据来,或有错误发生(网络数据错误),就会触发。在TCP下,因TCP的三次连接方式,SIGIO触发非常复杂。

还有一个可能的方法,就是异步I/O。但用的不广泛,可能不被支持。
回复

使用道具 举报

发表于 2004-3-14 17:06:52 | 显示全部楼层
能不能用多线程呢?
比如专门开一个线程,用阻塞方式来读一个socket,凡是和数据处理无关的事都放到其他线程里处理,这样行吗?
回复

使用道具 举报

发表于 2004-3-14 17:58:52 | 显示全部楼层
select函数?
回复

使用道具 举报

发表于 2004-3-14 19:56:46 | 显示全部楼层
sjinny说的完全可以,这是当前多数tcp服务器的标准实现方法(当然,可以是多进程,可以再加上前端的负载均衡)。

Kilo的select,我认为不太合适。select是专门针对在编写软件时要检查多个输入条件才能决定下一步操作的情况。比如在五个条件(1,2,3,4,5),select可以设置为等待(1,3)满足,或(1,2,5)满足,但是在等待这些条件进,这个进程一样是阻塞的,无法往下执行,这就不太合楼主的要求了。在select中还有一个时间参数,可以设置这个参数为多少(比如秒),超过这个参数,就算等待的条件不满足,一样会被系统唤醒。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 19:51 , Processed in 0.061774 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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