VC socket 9903 被我close掉了,为什么下次再创建socket,分配的号还是9903,而且里面有数据。
发布网友
发布时间:2022-04-18 14:07
我来回答
共1个回答
热心网友
时间:2022-04-18 15:37
1.closesocket(一般不会立即关闭,并经历TIME_WAIT的过程)后想继续重用套接字:
和BOOL bReuseaddr = TRUE;
使用setsockopt(s,SOL_SOCKET,SO_REUSEADDR (为const char *)&bReuseaddr大小(BOOL));
2。已经在强行关闭的连接状态SOKET的调用closesocket关闭没有经历过
TIME_WAIT:
BOOL bDontLinger = FALSE;
使用setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(为const char *)&bDontLinger中,sizeof(BOOL));
的send(),recv()的过程中,有时由于网络条件等原因,不能指望发送和接收,设置发送和接收时间*:
诠释nNetTimeout = 1000 ;/ /秒
/ /发送时间*
使用setsockopt(插座,SOL_S0CKET,SO_SNDTIMEO(char *)的nNetTimeout,是sizeof(int));
/ /接收时间*使用setsockopt(插座,SOL_S0CKET SO_RCVTIMEO,(CHAR *)nNetTimeout,是sizeof(int));
发送()返回实际发送的字节(同步)或发送到socket缓冲区的字节/ (异步);默认状态下,系统发送和接收8688个字节(约8.5K),实际发送数据的过程中
大于套接字缓冲区中的数据可以设置,以避免在send(),RECV ()不断的循环收发器:
/ /接收缓冲区
诠释nRecvBuf = 32 * 1024 ;/ /设置32K
使用setsockopt(s,SOL_SOCKET,SO_RCVBUF,(为const char * )nRecvBuf,是sizeof(int));
/ /发送缓冲地带
诠释nSendBuf = 32 * 1024 ;/ / 32K
使用setsockopt(,SOL_SOCKET在SO_SNDBUF,(为const char *) nSendBuf,是sizeof(int));
发送数据时,他们不希望体验到的系统缓冲区的套接字缓冲区拷贝
程序影响性能:
诠释nZero = 0; BR />使用setsockopt(插座,SOL_S0CKET SO_SNDBUF,(CHAR *)nZero sizeof(nZero)的);
同上。在recv()以上(默认情况下的套接字缓冲区的内容复制到系统缓冲区):
诠释nZero = 0;
setsockopt函数(SO_RCVBUF套接字SOL_S0CKET,(字符*)nZero如sizeof(int));
一般发送UDP数据包,希望套接字发送数据广播的特点:
BOOL bBroadcast = TRUE;
使用setsockopt(SOL_SOCKET,SO_BROADCAST,(S,为const char *)&bBroadcast中,sizeof(BOOL));
8客户端连接到服务器的过程中,如果你是非阻塞模式的socket在connect()
过程中设置连接()延时,直到a*et()被调用(此功能只有在这个过程中的非阻塞
作用显着的作用,在阻塞的函数调用)
BOOL bConditionalAccept = TRUE;
使用setsockopt(s,SOL_SOCKET中,SO_CONDITIONAL_ACCEPT,(为const char *)&bConditionalAccept中,sizeof(BOOL));
在这个过程中,将数据发送(send()方法还没有完成,还没有数据发送)则closesocket()之前,我们
一般采取的措施是“小康”关机(S,SD_BOTH),但肯定是丢失的数据,如何设置程序中的具体应用,以满足<BR / (即没有完成数据发送后关闭套接字)?
结构萦绕{
u_short l_onoff;
u_short l_linger
萦绕m_sLinger;
m_sLinger.l_onoff = 1 ;/ /(在closesocket关闭()调用,但呆在那里时,数据不会被发送后)
/ /。 ,如果m_sLinger.l_onoff = 0,功能和2)的作用是相同的;
m_sLinger.l_linger = 5 ;/ /(允许停留五秒钟)
的setsockopt函数(,,SOL_SOCKET, SO_LINGER,(为const char *)&m_sLinger中,sizeof(流连忘返));