您的位置 首页 电源

UNIX网络编程――套接字选项(setsockopt)

setsockopt的一些用法:close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE; setsockopt(

setsockopt的一些用法:

close socket(一般不会当即封闭而阅历TIME_WAIT的进程)后想持续重用该socket:

BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)bReuseaddr,sizeof(BOOL));

假如要现已处于衔接状况的soket在调用close socket后强制封闭,不阅历TIME_WAIT的进程:

BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)bDontLinger,sizeof(BOOL));

在send(),recv()进程中有时因为网络状况等原因,发收不能预期进行,而设置收发时限:

int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)nNetTimeout,sizeof(int)); //接纳时限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)nNetTimeout,sizeof(int));

在send()的时分,回来的是实践发送出去的字节(同步)或发送到socket缓冲区的字节(异步);体系默许的状况发送和接纳一次为8688字节(约为8.5K);在实践的进程中发送数据和接纳数据量比较大,能够设置socket缓冲区,而避免了send(),recv()不断的循环收发:

// 接纳缓冲区 int nRecvBuf=32*1024;//设置为32K setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)nRecvBuf,sizeof(int)); //发送缓冲区 int nSendBuf=32*1024;//设置为32K setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)nSendBuf,sizeof(int));

假如在发送数据的时,期望不阅历由体系缓冲区到socket缓冲区的复制而影响程序的功用:

int nZero=0; setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)nZero,sizeof(nZero));

同上在recv()完结上述功用(默许状况是将socket缓冲区的内容复制到体系缓冲区):

int nZero=0; setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)nZero,sizeof(int));

一般在发送UDP数据报的时分,期望该socket发送的数据具有播送特性:

BOOL bBroadcast=TRUE; setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)bBroadcast,sizeof(BOOL));

在client衔接服务器进程中,假如处于非堵塞形式下的socket在connect()的进程中能够设置connect()延时,直到accept()被呼叫(本函数设置只要在非堵塞的进程中有明显的效果,在堵塞的函数调用中效果不大)

BOOL bConditionalAccept=TRUE; setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)bConditionalAccept,sizeof(BOOL));

假如在发送数据的进程中(send()没有完结,还有数据没发送)而调用了close socket(),曾经咱们一般采纳的办法是沉着封闭shutdown(s,SD_BOTH),可是数据是必定丢掉了,怎么设置让程序满意详细使用的要求(即让没发完的数据发送出去后在封闭socket)

struct linger { u_short l_onoff; u_short l_linger; }; linger m_sLinger; m_sLinger.l_onoff=1;//(在closesocket()调用,可是还有数据没发送结束的时分容许停留) // 假如m_sLinger.l_onoff=0;则功用和2.)效果相同; m_sLinger.l_linger=5;//(容许停留的时刻为5秒) setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)m_sLinger,sizeof(linger));

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/298169.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部