请教WinSock高手
aquam 2001-07-19 09:39:42 我的程序的某个线程每隔0.4s从服务器读取一次数据,读取数据的主要函数如下
现在的问题是:最初执行正常,过一段时间后,每次调用NetTrans函数,总是返回1,说
不能连接,然后就恢复不了了,只有结束程序,再运行。
跟踪进去,发现每次出错都是在最后那个connect上
错误代码为10055或10061
到底是怎么回事?如何解决,谢谢,大侠快出手
#define WRITEHANDLE(y) WriteHandle(&y,sizeof(y))
#define READHANDLE(y) ReadHandle(&y,sizeof(y))
#define HANDLE_ERROR (-1)
static SOCKET hSocket;
int NetTrans(TOnePeriodData *pData,int *ipSize,int iExpectPeriod,char *ServerNa
{
int iRealSize;
InitHandle();
if (!CreateHandle(ServerName,Port)) return 1; // 不能连接到目标计算机
if (!WriteFunc(0x0101)) return 2; // 在写入功能号时出错
if (!WRITEHANDLE(iExpectPeriod)) return 3; // 在写入预期周期数时出错
if (!READHANDLE(iExpectPeriod)) return 4; // 在读入实际周期数时出错
iExpectPeriod = iExpectPeriod/sizeof(TOnePeriodData);
if (iExpectPeriod <= 0) return 5; // 无采样数据
iRealSize = iExpectPeriod*sizeof(TOnePeriodData);
if (ipSize[0]<iRealSize) return 6; // 给出的缓冲区太小
if (!ReadHandleLong(pData,iRealSize)) return 7; // 在读入实际采样数据时出错
WriteSuccess();
ipSize[0] = iRealSize; // 传送成功
CloseHandle();
return 0;
}
//------------------------------------------------------------------------------
void InitHandle()
{
hSocket = INVALID_SOCKET;
}
//------------------------------------------------------------------------------
bool CreateHandle(char *ServerName,int Port)
{
if (hSocket==INVALID_SOCKET)
{
SOCKADDR_IN remoteAddr;
int err;
hSocket = socket(AF_INET, SOCK_STREAM, 0);
if (hSocket==INVALID_SOCKET)
return false;
int timeout = 4000;
int SocketErr;
SocketErr = setsockopt( hSocket, SOL_SOCKET, SO_RCVTIMEO,
(char *)&timeout, sizeof(timeout));
if (SocketErr != NO_ERROR)
{
CloseHandle();
return false;
}
IN_ADDR RemoteIpAddress;
struct hostent *host;
host = gethostbyname(ServerName);
if (host != NULL)
memcpy((char *)&RemoteIpAddress.S_un.S_un_b,(char *)host->h_addr_list[0],h
else
{
return false;
}
memset(&remoteAddr, 0,sizeof (remoteAddr));
remoteAddr.sin_family = AF_INET;
remoteAddr.sin_port = htons (Port);
remoteAddr.sin_addr = RemoteIpAddress;
err = connect(hSocket,(PSOCKADDR)&remoteAddr,sizeof(remoteAddr));
if (err == SOCKET_ERROR)
{
CloseHandle();
return false;
}
}
return true;
}