TCP socket如何清空发送缓冲区

时间:2021-07-09 12:28:45
大致代码如下:
m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if ( m_ConnectSock == INVALID_SOCKET ) {
AfxMessageBox(_T("新建Socket失败!"));
return FALSE;
}
CString strServIp;
GetDlgItemText(IDC_IP_ADDR, strServIp);
int iPort = GetDlgItemInt(IDC_CONNECT_PORT);
if ( iPort <= 0 || iPort > 65535 ) {
AfxMessageBox(_T("请输入合适的端口:1 - 65535"));
goto __Error_End;
}
char szIpAddr[16] = {0};
USES_CONVERSION;
strcpy_s(szIpAddr, 16, T2A(strServIp));

sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(iPort);
server.sin_addr.s_addr = inet_addr(szIpAddr);
if ( connect(m_ConnectSock, (struct sockaddr *)&server,  sizeof(struct sockaddr)) == SOCKET_ERROR ) {
AfxMessageBox(_T("连接失败,请重试!"));
goto __Error_End;
}


__Error_End:
closesocket(m_ConnectSock);
return TRUE;
这样建立了一个TCP socket连接
用了一个select模型

BOOL SOCKET_Select(SOCKET hSocket, int nTimeOut, BOOL bRead)
{
fd_set fdset;
timeval tv;
FD_ZERO(&fdset);
FD_SET(hSocket, &fdset);
nTimeOut = nTimeOut > 1000 ? 1000 : nTimeOut;
tv.tv_sec  = 0;
tv.tv_usec = nTimeOut;

int iRet = 0;
if ( bRead ) {
iRet = select(0, &fdset, NULL , NULL, &tv);
}else{
iRet = select(0, NULL , &fdset, NULL, &tv);
}

if(iRet <= 0) {
return FALSE;
} else if (FD_ISSET(hSocket, &fdset)){
return TRUE;
}
return FALSE;
}
问题是现在我用
SOCKET_Select(m_ConnectSock, 100, FALSE)
总是能检测到发送区有数据,如何清空发送缓冲区

6 个解决方案

#1


引用楼主 luckyboy101 的回复:
大致代码如下:
m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if ( m_ConnectSock == INVALID_SOCKET ) {
AfxMessageBox(_T("新建Socket失败!"));
return FALSE;
}
CString strServIp;
GetDlgItemText……



select(0, &fdset, NULL , NULL, &tv) 中第一个参数改为m_ConnectSock+1
你调试看看select的返回值 如果>0则可读或者可写,=0超时, <0错误

还有不明白你说的发送缓冲区是指什么。。。。

#2


发送的时候select成功并不是说缓冲区有数据可发,而是可以发送

#3


lz的意思是清空系统发送缓冲区???

#4


我也想知道怎么可以flush下socks的系统缓冲区。

#5


TCP/IP协议栈的发送和接收缓冲区,是系统自动管理里,类似于linux tcp/ip stack里的 sk_buff结构。

#6


楼主可以设置套接发送不延迟即可

setsockopt SO_DONTLINGER

#1


引用楼主 luckyboy101 的回复:
大致代码如下:
m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if ( m_ConnectSock == INVALID_SOCKET ) {
AfxMessageBox(_T("新建Socket失败!"));
return FALSE;
}
CString strServIp;
GetDlgItemText……



select(0, &fdset, NULL , NULL, &tv) 中第一个参数改为m_ConnectSock+1
你调试看看select的返回值 如果>0则可读或者可写,=0超时, <0错误

还有不明白你说的发送缓冲区是指什么。。。。

#2


发送的时候select成功并不是说缓冲区有数据可发,而是可以发送

#3


lz的意思是清空系统发送缓冲区???

#4


我也想知道怎么可以flush下socks的系统缓冲区。

#5


TCP/IP协议栈的发送和接收缓冲区,是系统自动管理里,类似于linux tcp/ip stack里的 sk_buff结构。

#6


楼主可以设置套接发送不延迟即可

setsockopt SO_DONTLINGER