繁体   English   中英

具有c的双向套接字(非阻塞)

[英]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结构以包含超时的剩余时间。

使用选择系统调用,并根据需要设置timeout参数。 Beej的指南仍然是大量示例代码的不错来源。

使用选择系统调用。 您也可能会发现很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM