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

setsockopt socket_error_socket error 10061_socket error什么意思(3)

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

socket error 10061_socket error什么意思_setsockopt socket_error

TCP_NODELAY是唯一使用IPPROTO_TCP层的选项,其他所有选项都使用SOL_SOCKET层。如果设置了SO_DEBUG选项,WINDOWS套接口供应商被鼓励(但不是必需)提供输出相应的调试信息。但产生调试信息的机制以及调试信息的形式已超出本规范的讨论范围。setsockopt()支持下列选项。其中“类型”表明optval所指数据的类型。选项 类型 意义SO_BROADCAST BOOL 允许套接口传送广播信息。SO_DEBUG BOOL 记录调试信息。SO_DONTLINER BOOL 不要因为数据未发送就阻塞关闭操作。设置本选项相当于将SO_LINGER的l_onoff元素置为零。setsockopt socket_errorSO_DONTROUTE BOOL 禁止选径;直接传送。SO_KEEPALIVE BOOL 发送“保持活动”包。SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留。SO_OOBINLINE BOOL 在常规数据流中接收带外数据。SO_RCVBUF int 为接收确定缓冲区大小。SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑(参见bind())。

SO_SNDBUF int 指定发送缓冲区大小。TCP_NODELAY BOOL 禁止发送合并的Nagle算法。setsockopt()不支持的BSD选项有:选项名 类型 意义SO_ACCEPTCONN BOOL 套接口在。SO_ERROR int 获取错误状态并清除。SO_RCVLOWAT int 接收低级水印。SO_RCVTIMEO int 接收超时。SO_SNDLOWAT int 发送低级水印。SO_SNDTIMEO int 发送超时。SO_TYPE int 套接口类型。IP_OPTIONS 在IP头中设置选项。返回:若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。错误代码:WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。setsockopt socket_errorWSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。WSAEFAULT:optval不是进程地址空间中的一个有效部分。WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

WSAEINVAL:level非法,或optval中的信息非法。WSAENETRESET:当SO_KEEPALIVE设置后连接超时。WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_DONTLINGER 、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE选项。WSAENOTCONN:当设置SO_KEEPALIVE后连接被复位。WSAENOTSOCK:描述字不是一个套接口。用法1.设置调用closesocket()后,仍可继续重用该socket。调用closesocket()一般不会立即关闭socket,而经历TIME_WAIT的过程。BOOL bReuseaddr = TRUE;setsockopt( s, SOL_SOCKET, SO_REUSEADDR, ( const char* )&bReuseaddr, sizeof( BOOL ) );2. 如果要已经处于连接状态的soket在调用closesocket()后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FALSE;setsockopt( s, SOL_SOCKET, SO_DONTLINGER, ( const char* )&bDontLinger, sizeof( BOOL ) );3.在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 ) );4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中如果发送或是接收的数据量比较大,可以设置socket缓冲区,避免send(),recv()不断的循环收发:// 接收缓冲区int nRecvBuf = 32 * 1024; //设置为32Ksetsockopt( s, SOL_SOCKET, SO_RCVBUF, ( const char* )&nRecvBuf, sizeof( int ) );//发送缓冲区int nSendBuf = 32*1024; //设置为32Ksetsockopt( 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 ) );


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

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

    • 刘永超
      刘永超

      我们就应该是没有敌对情绪亲密同胞

    • 魏晓硕
      魏晓硕

      我家少时欧尼

      • 赫连勃勃
        赫连勃勃

        果断把今天刚买的芝麻糊扔掉

    每日福利
    热点图片
    拼命载入中...