关于winsocket的错误,是什么原因呢?(50分)

  • 主题发起人 主题发起人 南宫吹云
  • 开始时间 开始时间

南宫吹云

Unregistered / Unconfirmed
GUEST, unregistred user!
我用tserversocket和tclientsocket做了一个局域网通讯的小程序,连接后过一段时间断开
连接时,tserversocket活动中,关闭tclientsocket,就会出错:
Asynchronous socket error 10054

有时是:
Windows socket error:(10054),on API 'send'

是什么原因引起的呢?
 
在TServerSocket的OnClientError事件中加入ErrorCode :=0;
 
对方关闭了连接,所以出错,你在连接前判断ClientSocket是不是有效的,再发送数据
 
这是因为一个Socket虚连接的其中一端没有发断开信号,但这个虚连接就已经断开了,
当检测到断开时,对端就会出现 WSAECONNRESET(10054)错误了。
所以,肯定不是关闭TClientSocket出这个错的,而是在连接状态下,把你的客户端程序直接关闭时出现的。
 
哇,好精辟呀!
 
怎么避免这样的错误出现呢?
 
在发送之前看这个连接是不是存在的,
 
张无忌:
是不是要在服务器端加个判断?在serversocket的ondisconnect事件中怎么写?

To szf,
>>这是因为一个Socket虚连接的其中一端没有发断开信号,但这个虚连接就已经断开了,
>>当检测到断开时,对端就会出现 WSAECONNRESET(10054)错误了。
>>所以,肯定不是关闭TClientSocket出这个错的,而是在连接状态下,把你的客户端程序
>>直接关闭时出现的。
我的情况确实如你所说,我是直接关闭了客户端程序出现的这个错误,但并不是每次关闭时
都出现,而且我也在客户端程序的formclosequery事件中写了clientsockt.close;这样不是
就已经向服务器发断开信号了吗?
 
代码:
   s_iplist.Clear;
   for i:=0 to servers.Socket.ActiveConnections-1 do
      s_iplist.Add(servers.Socket.Connections[i].RemoteAddress);
这样能不能列出所有活动的客户连接的IP?
 
To 南宫吹云:
这样可以判断所有的连接的IP,
还有你的服务器最好不用TServerSocke做,用select做最好,如果一定时间客户没有发出信号
就关闭连接
 
select 是什么东东?
 
select()是一个winsock函数
 
怎么用啊?
 
int select (

int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);

我的要求不能断开连接,得时刻保持在线,只有客户关闭客户端程序的时候,刷新当前所有
已连接用户的IP,等它重新连接上时再刷新一次。
 
你可以设置一个用户的超时,如果用户一定时间不发送数据就可以把确定用户掉线了
这个函数很好用,仔细看帮助把
 
int select (

int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);
是不是这个?
 
在客户端程序的formclosequery事件中写了clientsockt.close;
最好再做一个消息循环Application.ProcessMessages;

如填海精卫,所说的,加上ErrorCode := 0; 也是必须的,这样服务程序运行时比较稳定。
你可以把需求详细说一遍,我看看有什么简单的好办法。
 
ErrorCode := 0
不行,你要当你连接失败的时候关闭这个连接, 否则资源会消耗光的,
到了后来就会出错,ErrorCode=0都没有用,前面讨论过这个问题的
 
大致需求是这样的:服务器软件用tserversocket接收客户端所有请求,当有客户端用
tclientsoket与服务器连接时,服务器刷新当前所有已经连接用户的IP,当这个客户发
来请求命令时,服务器处理这个请求后,在当前IP表里查找到它的IP对应的INDEX,再将
处理过的信息返回给它:tserversocket.connect[index].sendtext();
基本就是这样的,可能客户端程序一关闭,服务器端没有来得及刷新IP表就向它返回数据了
所以出错,有什么好的办法没有?不要太浪费资源啊,因为除了SOCKET,还有串口同时工作
的,应该尽量高效低耗。
 
其实就是Tserversocket如何与多个tclientsocket协调工作的问题,当clientsocket断开时
能及时通知tserversocket,据说serversocket不是可以管理多线程的吗?大家也看到了,我
是用一个tstringlist保存与serversocket连接的所有用户ip的,当向客户发送数据时先判断
它的IP在IP表中的索引,我已经在tserversocket的onconnect和ondisconnect事件中分别
写了刷新IP表的代码了。看大家还有什么好的办法没有?
 
后退
顶部