TCP/IP通讯问题
我用TCP/IP建立了C/S结构。
客户端首先发数据,服务端等40MS后给客户端发数据。
客户端没100MS检查是否收到数据,收到就给服务器发。
循环执行。
大部分情况都很好,只是出现一个怪现象。
没隔10分钟,就会出现收不到数据的情况。发现每隔10分钟,SOCKET会缓存几拍一起发送。
我已经设置SOKET为NO_DELAY发送了,还是不行。
各位大虾,给点意见吧。
服务端建立程序如下:
/* The WinSock DLL is acceptable. Proceed. */
GROUP g = 0;
//
sServer = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, g, 0);
//sServer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED);
//创建套接字
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockaddr_in));
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(SerPort);
sockAddr.sin_addr.S_un.S_addr = inet_addr(IPAddr);
int ret = bind(sServer, (sockaddr*)(&sockAddr), sizeof(sockaddr_in));
if (ret != 0)
{
return CTEC_BINDERR;
}
else
{
DWORD dwBytesReturned = 0;
BOOL bNewBehavior = TRUE; //ture 非阻塞 false 阻塞
DWORD status;
// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(sServer, FIONBIO,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned,
NULL, NULL);
if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return 0;
}
else
{
return 0;
}
}
int killnagle = 0;
int result = setsockopt(sServer, IPPROTO_IP, TCP_NODELAY, (const char*)&killnagle, sizeof(int));
if (result != 0)
{
return 0;
}
setsockopt(sServer,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
setsockopt(sServer,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
listen(sServer, 1);
客户端建立如下:
GROUP g = 0;
// sClient = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, g, 0);
sClient = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, g, 0);
sockaddr_in dstAddr;
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.S_un.S_addr = inet_addr(sServerAddr);
dstAddr.sin_port = htons(uSerPort);
int ret = WSAConnect(sClient, (sockaddr*)(&dstAddr), sizeof(SOCKADDR), NULL, NULL,NULL, NULL );
if (ret == 0)
{
pClientRecvBuffer = new char[MAX_DATA_LEN];
memset(pClientRecvBuffer, 0, MAX_DATA_LEN);
DWORD dwBytesReturned = 0;
BOOL bNewBehavior = TRUE; //ture Not blocking false blocking
DWORD status;
// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(sClient, FIONBIO,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned,
NULL, NULL);
if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return 0;
}
else
{
return 0;
}
}
int killnagle = 0;
int result = setsockopt(sClient, IPPROTO_IP, TCP_NODELAY, (const char*)&killnagle, sizeof(int));
if (result != 0)
{
return 0;
}
setsockopt(sClient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
setsockopt(sClient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));