[英]bidirectional socket (non-blocking) with c
我尝试通过TCP套接字进行某种聊天。 服务器端在php中实现,并且(应该)工作正常。
不,我在客户端遇到问题(在c [c99]中实现):
我想从服务器监听(读取)“新字节”,并且每当用户输入新数据时,我也想向服务器发送(写入)“一些字节”。
现在的问题是:->我如何侦听传入的流量(读取),并且仍然能够每隔1秒调用一次回调,我可以在其中检查要发送到服务器的新字节? 我知道我必须使用select(系统调用),但是我不知道如何处理超时等。select在特定时间内也处于阻塞状态。
感谢您的任何示例。
有一个名为select
的函数可用于此目的。 它可以检查套接字上是否有新的输入要读取,并且有超时,因此也可以用于您的计时器。
它以一种形式存在于所有主要操作系统上。 只需在Google搜索socket select <your operating system> example
,您将获得大量结果。
select
的最后一个参数用于超时。 它是指向struct timeval
的指针,该结构包含用于设置超时的字段。
如果将此指针作为NULL
传递,则没有超时,并且select
可以无限期阻塞。
要设置超时,您需要将timeval
结构的tv_sec
字段设置为秒数,并将tv_usec
字段设置为微秒数(必须小于一百万)。 通过将这些字段设置为零,可以将超时设置为零,即仅进行快速轮询。
如果select
返回零,则表示超时。
例如,超时1.5秒:
for (;;)
{
fd_set readset;
int maxfd;
/* Initialize and set `readset` and `maxfd` */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
int res = select(maxfd + 1, &readset, NULL, NULL, &tv);
if (res == -1)
perror("select"); /* Error */
else if (res == 0)
{
/* Timeout, do something */
}
else
{
/* A socket in `readset` is readable */
}
}
如果select
在超时之前返回,则修改timeval
结构以包含超时的剩余时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.