C下判断socket连接状态,怎么实现

HXDSAMA 2012-02-27 02:25:30
是否有直接提供该功能的函数还是要自己另外实现,又如何实现。。。
...全文
596 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2012-02-28
  • 打赏
  • 举报
回复
你close(talk);之后,仍然在send啊。

另外,你这段代码,cpu占百分之百的,只有在每分钟的第0秒有一个send调用!
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 yang79tao 的回复:]
服务端与客户端,是你的业务模型,与网络编程可以说无关,服务端只是多了一个监听,当accept之后(得到一个新的套节字),就是点对点的了,这两个套节字是平等的。

你屏蔽了SIGPIPE还是进程退出,就更证明我前面说的了,是你的其它地方的代码的问题。
[/Quote]


while(1)
{
time_t nowtime;
time( &nowtime );
timeinfo = localtime( &nowtime );
time_sec = timeinfo->tm_sec;
time_min = timeinfo->tm_min;

if(time_sec == 00)
{
int error =send(talk,msg_send,sizeof(msg_send),0);
printf("wrong is: %i \n",error);
if (error<0){
close(talk);
}
}
while(time_sec ==00){
time_t nowtime;
time( &nowtime );
timeinfo = localtime( &nowtime );
time_sec = timeinfo->tm_sec;
}
}


有什么问题吗 这个
youngwolf 2012-02-28
  • 打赏
  • 举报
回复
服务端与客户端,是你的业务模型,与网络编程可以说无关,服务端只是多了一个监听,当accept之后(得到一个新的套节字),就是点对点的了,这两个套节字是平等的。

你屏蔽了SIGPIPE还是进程退出,就更证明我前面说的了,是你的其它地方的代码的问题。
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 luckpiky 的回复:]
socket断开,不是send返回失败吗?
[/Quote]
我这边直接跳出程序了 代码里没有任何一句指向关闭程序啊
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yang79tao 的回复:]
我当然试过,一切默认,服务端退出后,客户端继续写,写几次之后,send出错,把错误代码映射到字符串,大概就是:
pipe broken

我没有忽略SIGPIPE,感觉默认这个信号并不退出程序,如果退出,那忽略掉即可。
[/Quote]
我这边是服务端不是客户端,存在区别吗
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 justkk 的回复:]
signal(SIGPIPE, SIG_IGN);
[/Quote]
加了这句编译的时候报警告,
s.c:17: warning: data definition has no type or storage class
s.c:17: warning: parameter names (without types) in function declaration

发送的时候还是终止进程了
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yang79tao 的回复:]
关不关闭线程,要看你的设计。
解决cpu百分之百占用,当然就是加sleep了。
[/Quote]
超过几个客户端断连以后...会往现在连接的客户端多发送一条指令...算了 我自己慢慢研究吧
youngwolf 2012-02-28
  • 打赏
  • 举报
回复
关不关闭线程,要看你的设计。
解决cpu百分之百占用,当然就是加sleep了。
HXDSAMA 2012-02-28
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yang79tao 的回复:]
你close(talk);之后,仍然在send啊。

另外,你这段代码,cpu占百分之百的,只有在每分钟的第0秒有一个send调用!
[/Quote]
signal(SIGCHLD,SIG_IGN);
加了这句 发送时不终止进程了..

关闭 talk后,销毁该线程么? CPU占用的话是否要让线程wait一会?
小懿大侠 2012-02-27
  • 打赏
  • 举报
回复
socket断开,不是send返回失败吗?
youngwolf 2012-02-27
  • 打赏
  • 举报
回复
我当然试过,一切默认,服务端退出后,客户端继续写,写几次之后,send出错,把错误代码映射到字符串,大概就是:
pipe broken

我没有忽略SIGPIPE,感觉默认这个信号并不退出程序,如果退出,那忽略掉即可。
justkk 2012-02-27
  • 打赏
  • 举报
回复
signal(SIGPIPE, SIG_IGN);
HXDSAMA 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 justkk 的回复:]
引用 8 楼 hxdsama 的回复:

引用 1 楼 justkk 的回复:
没有吧
即使socket连接断开,也不见得会立即发送失败
LINUX系统下send数据到已经断开的客户端 会引发 终止进程事件 致命的嘛...如何去先判断是否已经断开了

那就忽略SIGPIPE 信号
[/Quote]
这怎么实现啊...
justkk 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hxdsama 的回复:]

引用 1 楼 justkk 的回复:
没有吧
即使socket连接断开,也不见得会立即发送失败
LINUX系统下send数据到已经断开的客户端 会引发 终止进程事件 致命的嘛...如何去先判断是否已经断开了
[/Quote]
那就忽略SIGPIPE 信号
HXDSAMA 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yang79tao 的回复:]
方法就是前面说的。

你的进程被终止,是你程序设计的问题,与网络编译无关。
linux下的套节字就是一个整数,你随便发到哪一个整数,哪怕它根本就不是一个套节字,也不会让程序崩溃,它会返回一个错误给调用者。

你得处理操作套节字失败的情况,这是网络编程中最基本的要求。
[/Quote]
看别人也是这么说的 发送数据时对方的套接字如果关闭的话 LINUX系统就会引发这个事件 ...你是自己试过不会终止吗
youngwolf 2012-02-27
  • 打赏
  • 举报
回复
方法就是前面说的。

你的进程被终止,是你程序设计的问题,与网络编译无关。
linux下的套节字就是一个整数,你随便发到哪一个整数,哪怕它根本就不是一个套节字,也不会让程序崩溃,它会返回一个错误给调用者。

你得处理操作套节字失败的情况,这是网络编程中最基本的要求。
HXDSAMA 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justkk 的回复:]
没有吧
即使socket连接断开,也不见得会立即发送失败
[/Quote]LINUX系统下send数据到已经断开的客户端 会引发 终止进程事件 致命的嘛...如何去先判断是否已经断开了
HXDSAMA 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yang79tao 的回复:]
正常情况下(两端都正常,都标准的操作套节字),对于连接断开这个事件,是可以马上知道的,前提是你不停的在读取套节字(网络编程中都是不停的读的),它会返回一个错误。那么,当没有发生这个事件的时候,你可以认为连接是好的。
select只是用来判断哪些套节字可读可写什么的,可读不代表连接是好的,当连接正常关闭时,对端的大节字仍然返回可读(只是recv返回0罢了)。


另外,网络编程与语言和操作系……
[/Quote]
我现在在LINUX系统下send数据到已经断开的客户端 会引发 终止进程事件 有什么办法能在发送时先判断该客户端是否断开了么
youngwolf 2012-02-27
  • 打赏
  • 举报
回复
正常情况下(两端都正常,都标准的操作套节字),对于连接断开这个事件,是可以马上知道的,前提是你不停的在读取套节字(网络编程中都是不停的读的),它会返回一个错误。那么,当没有发生这个事件的时候,你可以认为连接是好的。
select只是用来判断哪些套节字可读可写什么的,可读不代表连接是好的,当连接正常关闭时,对端的大节字仍然返回可读(只是recv返回0罢了)。


另外,网络编程与语言和操作系统都无关,只是使用的api不同而已。
HXDSAMA 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yang79tao 的回复:]
上面说的是异常情况下,比如拔网线。

正常情况下,对方关闭了连接,你(底层)也收到了这个关闭消息,则可以马上实时的知道网络的通断情况。
[/Quote]
正常情况而言 也没有函数可以实现么 select如何?
加载更多回复(4)

23,118

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧