Mar*_*ser 5 c sockets terminal copy-paste telnet
简短问题
在服务器端处理通过Telnet发送的Ctrl-C事件的正确方法是什么?
长问题
在套接字上调用recv()之后,我想适当地处理一些情况.其中之一是在收到Ctrl-C时返回某个错误代码.检测到这种情况的正确方法是什么?以下工作,但它似乎不正确:
size_t recv_count;
static char ctrl_c[5] = {0xff, 0xf4, 0xff, 0xfd, 0x06};
recv_count = recv(socket, buffer, buffer_size, 0);
if (recv_count == sizeof(ctrl_c) &&
memcmp(buffer, ctrl_c, sizeof(ctrl_c) == 0)
{
return CTRL_C_RECEIVED;
}
Run Code Online (Sandbox Code Playgroud)
我在这个 UNIX Socket FAQ 的旁注中找到了对Ctrl-C的评论:
[...](顺便说一下,带外通常也用于ctrl-C).
据我所知,接收带外数据是使用recv()完成的,并将某个标志作为最后一个参数.但是,当我在上面的代码中使用recv()等待数据时,我无法同时读取带外数据.除此之外,我正在使用recv()获得一些没有oob-flag的东西.
使用 fcntl() 将套接字设置为非阻塞,使用 select()(某些系统上为 pselect())检查到达的数据。这就是如何采样套接字的当前状况,即是否有数据要recv(),是否可以接受send(),或者是否有异常。不要只是坐在那里阻挡。
recv() 返回所提供的缓冲区可以容纳的尽可能多的可用信息。如果套接字已配置为接收带外数据(套接字选项 SO_OOBINLINE)并且存在未读取的 OOB 数据,则仅返回带外数据。调用 ioctl() SIOCATMARK 来确定是否还有更多带外数据未读取。
当您接收 OOB 数据时,您无法在单个 recv() 调用中调用超过 OOB 数据包末尾的 recv() ,因此在这方面它是万无一失的。
我不知道什么是最佳实践,但在其他已缓冲的套接字数据之前获取 ctrl-c 的想法是一个很好的想法。
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |