b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

setsockopt socket_error_socket setsotimeout_setsockopt 阻塞(5)

电脑杂谈  发布时间:2017-05-14 04:01:09  来源:网络整理

//接收时限

setsockopt( socket, SOL_S0CKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );

4.在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 ) );

5.在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能:

int nZero = 0;

setsockopt( socket, SOL_S0CKET, SO_SNDBUF, ( char * )&nZero, sizeof( nZero ) );

6.在接收数据时,不执行将socket缓冲区的内容拷贝到系统缓冲区:

int nZero = 0;

setsockopt( s, SOL_S0CKET, SO_RCVBUF, ( char * )&nZero, sizeof( int ) );

7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:

BOOL bBroadcast = TRUE;

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

8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被调用(此设置只

有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)

BOOL bConditionalAccept = TRUE;

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

9.如果在发送数据的过程中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; //在调用closesocket()时还有数据未发送完,允许等待

// 若m_sLinger.l_onoff=0;则调用closesocket()后强制关闭

m_sLinger.l_linger = 5; //设置等待时间为5秒

setsockopt( s, SOL_SOCKET, SO_LINGER, ( const char* )&m_sLinger, sizeof( linger ) );

10.判断非阻塞式connect调用是否成功。

FD_SET rset;

FD_SET wset;

FD_ZERO(&rset);

FD_ZERO(&wset);

FD_SET(s,&rset);

wset=rset;

struct timeval tm;

tm.tv_sec=5;

tm.tv_usec=0;

int n=select(0,&rset,&wset,NULL,&tm);

if(n>0)

{

int err;

int len=sizeof(int);

getsockopt(sockClient,SOL_SOCKET,SO_ERROR,(char *)&err,&len);

//如果 err 为0 则表示connect调用成功,否则失败。

}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-46991-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...