在网络编程中.在发送数据的过程中send()没有完成,还有数据没发送,而调用了closesocket(),
以前一般采取的措施是shutdown(s,SD_BOTH),但是数
据将会丢失。某些具体程序要求待未发送完的数据发送出去后再关闭
socket,可通过设置让程序满足要求:
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff = 1; //在调用close
socket()时还有数据未发送完,允许等待
// 若m_sLinger.l_onoff=0;则调用
closesocket()后强制关闭
m_sLinger.l_linger = 5; //设置等待时间为5秒
setsockopt( s, SOL_SOCKET, SO_LINGER, ( const char* )&m_sLinger, sizeof( linger ) );
以下是一个使用列子:
CloseSocketSafe()
{
LINGER TcpLinger;
int iRet = 0;
TcpLinger.l_onoff = 1;
TcpLinger.l_linger = 5;
iRet = setsockopt(m_hFile, SOL_SOCKET, SO_LINGER,
(const char*)&TcpLinger, sizeof(LINGER));
iRet = shutdown(m_hFile, SHUT_WR); //SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
iRet = closesocket(m_hFile);
return 0;
}
{
LINGER TcpLinger;
int iRet = 0;
TcpLinger.l_onoff = 1;
TcpLinger.l_linger = 5;
iRet = setsockopt(m_hFile, SOL_SOCKET, SO_LINGER,
(const char*)&TcpLinger, sizeof(LINGER));
iRet = shutdown(m_hFile, SHUT_WR); //SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
iRet = closesocket(m_hFile);
return 0;
}
//参考shoudown(),setsocketopt()的使用。