当前位置: 技术问答>linux和unix
connect()问题
来源: 互联网 发布时间:2016-11-05
本文导语: 在客户端 connect()链接成功了, 但是用send()给服务器发数据时,程序直接终止了, 网上说,如果断开链接了,调用send()发送数据时,会产生SIGPIPE信号,而这个信号默认是终止进程, 我用signal()接收这个信...
在客户端 connect()链接成功了,
但是用send()给服务器发数据时,程序直接终止了,
网上说,如果断开链接了,调用send()发送数据时,会产生SIGPIPE信号,而这个信号默认是终止进程,
我用signal()接收这个信号,果然发现当掉用send()时长生了这个信号,
但是connect()已经链接成功了,但为什么又断开了呢?怎么回事呢?
我是在虚拟机上运行的,一个虚拟机运行服务器程序,一个运行客户端程序。
(客户端和服务端运行在一个机子上时可以正常运行)
但是用send()给服务器发数据时,程序直接终止了,
网上说,如果断开链接了,调用send()发送数据时,会产生SIGPIPE信号,而这个信号默认是终止进程,
我用signal()接收这个信号,果然发现当掉用send()时长生了这个信号,
但是connect()已经链接成功了,但为什么又断开了呢?怎么回事呢?
我是在虚拟机上运行的,一个虚拟机运行服务器程序,一个运行客户端程序。
(客户端和服务端运行在一个机子上时可以正常运行)
|
signal(SIGPIPE,SIG_IGN); //忽略管道错误
|
“用send()给服务器发数据时,程序直接终止了,”我觉得有可能的一个原因是,你的缓冲区在写数据的时候越界了,导致了程序访问了非法内存,所以程序终止掉了。
检查一下你发送数据的缓冲区。
检查一下你发送数据的缓冲区。
|
连接断开后,数据无论如何也发不到服务器了..
是不是连接建立很长时间了了,一直没有数据传输??
是不是连接建立很长时间了了,一直没有数据传输??
|
“但是connect()已经链接成功了,但为什么又断开了呢?怎么回事呢?”
这个很正常啊!就像你昨天已经吃过饭了,今天怎么又饿了呢?
你写一个读端已经不存在的管道当然要产生SIGPIPE信号了。
这个很正常啊!就像你昨天已经吃过饭了,今天怎么又饿了呢?
你写一个读端已经不存在的管道当然要产生SIGPIPE信号了。
|
建议直接用read,write 进行操作。
|
信号处理的问题,当数据发生出现异常,信号会终止当前程序
默认信号值是0
默认信号值是0
|
同意!
方便的话,把代码贴出来看一下。
|
可能内存越界了
|
关键问题应该是connect后为什么会断开
如果没断开,发数据就不会产生sigpipe信号
可能程序退出的原因并不是连接断开了,而是数据越界了
如果没断开,发数据就不会产生sigpipe信号
可能程序退出的原因并不是连接断开了,而是数据越界了