请教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;
}
...全文
45 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwunix 2001-07-20
  • 打赏
  • 举报
回复
每隔0.4s从服务器读取一次数据,可能是连接太频繁,导致服务器来不及处理。(个人观点,仅供参考)

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧