当前位置: 技术问答>linux和unix
急,socket编程的两个问题,谢谢
来源: 互联网 发布时间:2015-10-31
本文导语: uclinux系统2.4的内核 1.一个socket创建后,设为NONBLOCK,connect成功,这时将服务器挂断,此时调用 send(socket_fd,ptr,bytes_left,MSG_NOSIGNAL);第一次能发送成功,第二次才返回EPIPE,这是为什么?怎么才能使其第一次就返回对...
uclinux系统2.4的内核
1.一个socket创建后,设为NONBLOCK,connect成功,这时将服务器挂断,此时调用
send(socket_fd,ptr,bytes_left,MSG_NOSIGNAL);第一次能发送成功,第二次才返回EPIPE,这是为什么?怎么才能使其第一次就返回对方服务器已挂断。
2.一个socket创建后,bind,listen,再accept一个连接,收发数据后,将listen_sock和accept_sock都close,再create,bind,此时bind就会失败,这是为什么?怎么解决?这是否和我没有在close之前shutdown有关?
急,哪位帮个忙,谢谢!!!
1.一个socket创建后,设为NONBLOCK,connect成功,这时将服务器挂断,此时调用
send(socket_fd,ptr,bytes_left,MSG_NOSIGNAL);第一次能发送成功,第二次才返回EPIPE,这是为什么?怎么才能使其第一次就返回对方服务器已挂断。
2.一个socket创建后,bind,listen,再accept一个连接,收发数据后,将listen_sock和accept_sock都close,再create,bind,此时bind就会失败,这是为什么?怎么解决?这是否和我没有在close之前shutdown有关?
急,哪位帮个忙,谢谢!!!
|
回答第2个问题:因为你bind一个地址之后,就算你关闭了,已关闭的SOCKET进行TIME_WAIT状态。所以你要过一段时间才能用,你在创建socket后调用这个函数就行了
bool SockUtilEnableNoTimeWait(int sock)
{
struct linger linger;
socklen_t nLingerLen = sizeof(linger);
linger.l_onoff = 1;
linger.l_linger = 0;
if (setsockopt(sock, SOL_SOCKET, SO_LINGER,
(char*)&linger, nLingerLen) == -1)
{
//设置失败
return false;
}
else
{
//设置成功
return true;
}
}
这样下次就能立刻使用
bool SockUtilEnableNoTimeWait(int sock)
{
struct linger linger;
socklen_t nLingerLen = sizeof(linger);
linger.l_onoff = 1;
linger.l_linger = 0;
if (setsockopt(sock, SOL_SOCKET, SO_LINGER,
(char*)&linger, nLingerLen) == -1)
{
//设置失败
return false;
}
else
{
//设置成功
return true;
}
}
这样下次就能立刻使用
|
第一个问题,如果你不是正常close掉服务器的套接字的话,属于非异常断开,这是另一端并不能马上就检测到链接异常。