当前位置: 技术问答>linux和unix
一个关于socket的小问题
来源: 互联网 发布时间:2015-06-26
本文导语: 我写了一段聊天的程序,我的设计思路大致是: FD_ZERO( sockset); FD_SET( sockfd, sockset); for ( 所有有效连接) FD_SET( userfd[i], sockset); maxfd = 最大的文件描述符号 + 1; server 处理如下: while (1) { select( maxfd, ...
我写了一段聊天的程序,我的设计思路大致是:
FD_ZERO( sockset);
FD_SET( sockfd, sockset);
for ( 所有有效连接)
FD_SET( userfd[i], sockset);
maxfd = 最大的文件描述符号 + 1;
server 处理如下:
while (1) {
select( maxfd, &sockset, NULL, NULL, NULL);
if ( FD_ISSET( sockfd, &sockset)) {
// 有新连接
建立新连接, 并将该连接描述符加入到 sockset 中去了.
}
for ( 所有有效连接) {
if ( FD_ISSET ( userfd[i], &sockset)) {
// 该连接中有字符可读
从该连接中读入字符, 并发送到其他有效连接中去.
}
}
重新设置 sockset;
}
但是现在的问题是:我怎么在轮询的时候,知道某个socket连接已经断开,然后我好对它做一些处理呢?因为可能不是正常的断开连接,是以外中断连接
FD_ZERO( sockset);
FD_SET( sockfd, sockset);
for ( 所有有效连接)
FD_SET( userfd[i], sockset);
maxfd = 最大的文件描述符号 + 1;
server 处理如下:
while (1) {
select( maxfd, &sockset, NULL, NULL, NULL);
if ( FD_ISSET( sockfd, &sockset)) {
// 有新连接
建立新连接, 并将该连接描述符加入到 sockset 中去了.
}
for ( 所有有效连接) {
if ( FD_ISSET ( userfd[i], &sockset)) {
// 该连接中有字符可读
从该连接中读入字符, 并发送到其他有效连接中去.
}
}
重新设置 sockset;
}
但是现在的问题是:我怎么在轮询的时候,知道某个socket连接已经断开,然后我好对它做一些处理呢?因为可能不是正常的断开连接,是以外中断连接
|
发生读事件,read or recv的返回为0
|
楼上的兄弟已经说了
|
如果你使用的是tcp,则socket断开时select会得到相应的信息;如果使用的是udp,可以每个一段时间发送若干测试数据,如果没有响应,可认为对方已经断开。