问题:我寫了一個互通信程序,分別使用clientsocket和serversocket,連接後執行各種操作,一切都很正常,但只要在一段較常時間(約半小時)裡,程序在已連接的狀態下而沒有進行任何通信,當clien端再向server端發送指令時,卻發現連接已斷開,請問這是什麼原因?該如何解決?
謝謝.
出现这种现象不一定是你的错误,连接断了很多原因的。
解答:很多成熟的通讯软件都会隔一会儿发个无用数据来保持连接。。。判断的方法也很明显,一段时间内客户端没有请求就表示断了,当然客户端正常退出应该礼貌的给服务端先发个退出信号以便尽早关闭连接资源。
如果你的通信的行为特征是不定期发数据,那么推荐用短连接,环境信息双方都独立保持,就是在每次需要发数据的时候才连接,发完就断开连接。银行取钱,认证之类通讯就是如此。
我的结论:
Tclientsocket无法得知tserversocket端是否断开连接,即无法从clientsocket.active是否为true判断,clientsocket.active为true只能说明“whether the socket connection is open and available for communication with other machines”,即只能说明本端的socket是否已准备好与远端通信,至于远端是否连接正常是无法了解的。
解决方法1:
自定义一个全局变量myconnect:boolean,用于指示连接状态,只有当clientsocket的Onconnect事件发生时,设置该变量为true;只有当OnError事件发生时,捕捉所有错误类型(ErrorEvent变量)设置变量为false,
解决方法2:
发数据确认连接,一段时间内客户端没有请求就表示断了,当然客户端正常退出应该礼貌的给服务端先发个退出信号以便尽早关闭连接资源
Socket
错误返回码
Socket error 0 - Directly send error
Socket error 10004 - Interrupted function call
Socket error 10013 - Permission denied
Socket error 10014 - Bad address
Socket error 10022 - Invalid argument
Socket error 10024 - Too many open files
Socket error 10035 - Resource temporarily unavailable
Socket error 10036 - Operation now in progress
Socket error 10037 - Operation already in progress
Socket error 10038 - Socket operation on non-socket
Socket error 10039 - Destination address required
Socket error 10040 - Message too long
Socket error 10041 - Protocol wrong type for socket
Socket error 10042 - Bad protocol option
Socket error 10043 - Protocol not supported
Socket error 10044 - Socket type not supported
Socket error 10045 - Operation not supported
Socket error 10046 - Protocol family not supported
Socket error 10047 - Address family not supported by protocol family
Socket error 10048 - Address already in use
Socket error 10049 - Cannot assign requested address
Socket error 10050 - Network is down
Socket error 10051 - Network is unreachable
Socket error 10052 - Network dropped connection on reset
Socket error 10053 - Software caused connection abort
Socket error 10054 - Connection reset by peer
Socket error 10055 - No buffer space available
Socket error 10056 - Socket is already connected
Socket error 10057 - Socket is not connected
Socket error 10058 - Cannot send after socket shutdown
Socket error 10060 - Connection timed out
Socket error 10061 - Connection refused
Socket error 10064 - Host is down
Socket error 10065 - No route to host
Socket error 10067 - Too many processes
Socket error 10091 - Network subsystem is unavailable
Socket error 10092 - WINSOCK.DLL version out of range
Socket error 10093 - Successful WSAStartup not yet performed
Socket error 10094 - Graceful shutdown in progress
Socket error 11001 - Host not found
Socket error 11002 - Non-authoritative host not found
Socket error 11003 - This is a non-recoverable error
Socket error 11004 - Valid name, no data record of requested type
WSAEADDRINUSE (10048) Address already in use
WSAECONNABORTED (10053) Software caused connection abort
WSAECONNREFUSED (10061) Connection refused
WSAECONNRESET (10054) Connection reset by peer
WSAEDESTADDRREQ (10039) Destination address required
WSAEHOSTUNREACH (10065) No route to host
WSAEMFILE (10024) Too many open files
WSAENETDOWN (10050) Network is down
WSAENETRESET (10052) Network dropped connection
WSAENOBUFS (10055) No buffer space available
WSAENETUNREACH (10051) Network is unreachable
WSAETIMEDOUT (10060) Connection timed out
WSAHOST_NOT_FOUND (11001) Host not found
WSASYSNOTREADY (10091) Network sub-system is unavailable
WSANOTINITIALISED (10093) WSAStartup() not performed
WSANO_DATA (11004) Valid name, no data of that type
WSANO_RECOVERY (11003) Non-recoverable query error
WSATRY_AGAIN (11002) Non-authoritative host found
WSAVERNOTSUPPORTED (10092) Wrong WinSock DLL version
Socket error 10004 - Interrupted function call
Socket error 10013 - Permission denied
Socket error 10014 - Bad address
Socket error 10022 - Invalid argument
Socket error 10024 - Too many open files
Socket error 10035 - Resource temporarily unavailable
Socket error 10036 - Operation now in progress
Socket error 10037 - Operation already in progress
Socket error 10038 - Socket operation on non-socket
Socket error 10039 - Destination address required
Socket error 10040 - Message too long
Socket error 10041 - Protocol wrong type for socket
Socket error 10042 - Bad protocol option
Socket error 10043 - Protocol not supported
Socket error 10044 - Socket type not supported
Socket error 10045 - Operation not supported
Socket error 10046 - Protocol family not supported
Socket error 10047 - Address family not supported by protocol family
Socket error 10048 - Address already in use
Socket error 10049 - Cannot assign requested address
Socket error 10050 - Network is down
Socket error 10051 - Network is unreachable
Socket error 10052 - Network dropped connection on reset
Socket error 10053 - Software caused connection abort
Socket error 10054 - Connection reset by peer
Socket error 10055 - No buffer space available
Socket error 10056 - Socket is already connected
Socket error 10057 - Socket is not connected
Socket error 10058 - Cannot send after socket shutdown
Socket error 10060 - Connection timed out
Socket error 10061 - Connection refused
Socket error 10064 - Host is down
Socket error 10065 - No route to host
Socket error 10067 - Too many processes
Socket error 10091 - Network subsystem is unavailable
Socket error 10092 - WINSOCK.DLL version out of range
Socket error 10093 - Successful WSAStartup not yet performed
Socket error 10094 - Graceful shutdown in progress
Socket error 11001 - Host not found
Socket error 11002 - Non-authoritative host not found
Socket error 11003 - This is a non-recoverable error
Socket error 11004 - Valid name, no data record of requested type
WSAEADDRINUSE (10048) Address already in use
WSAECONNABORTED (10053) Software caused connection abort
WSAECONNREFUSED (10061) Connection refused
WSAECONNRESET (10054) Connection reset by peer
WSAEDESTADDRREQ (10039) Destination address required
WSAEHOSTUNREACH (10065) No route to host
WSAEMFILE (10024) Too many open files
WSAENETDOWN (10050) Network is down
WSAENETRESET (10052) Network dropped connection
WSAENOBUFS (10055) No buffer space available
WSAENETUNREACH (10051) Network is unreachable
WSAETIMEDOUT (10060) Connection timed out
WSAHOST_NOT_FOUND (11001) Host not found
WSASYSNOTREADY (10091) Network sub-system is unavailable
WSANOTINITIALISED (10093) WSAStartup() not performed
WSANO_DATA (11004) Valid name, no data of that type
WSANO_RECOVERY (11003) Non-recoverable query error
WSATRY_AGAIN (11002) Non-authoritative host found
WSAVERNOTSUPPORTED (10092) Wrong WinSock DLL version
请问怎样测试一个TCP/IP连接是否成功
if Connect(Socket, @SockAddrIn, SizeOf(SockAddrIn))=-1 then
begin
Messagebox(0,'连接不成功!','提示',mb_ok);
exit;
end else
begin
.........
.......
关于Indy9 的 TIdUDPServer通信问题
我公司的应用需要通过网络发送消息给客户,大概有
2000
个左右客户同时在线吧,客户端和服务器端都使用的是
Indy
的
TIdUDPServer
控件(因为考虑到以后各个用户之间可以互相通信,类似
QQ
吧)。有很多用户都是通过路由器共享
ADSL
上网的,在应用中发现客户端刚刚连接上去一切正常(如,服务端收到客户端的地址为
221.10.20.20
,端口为
23232
),在一段时间不发送消息后,服务器端再向该地址及端口发送数据给客户端的时候,客户端基本上都收不到数据。用客户端发数据给服务器端,可以收到数据,但该客户在服务器端登记的
UDP
端口号已经同收到的数据内的端口号不一样了,请问问题在什么地方?
这是正常的
...
你是服务器是不是放在公网上 . 而你的客户端是用在内部网的 , 也就是放在 NAPT( 一般都是这个 ) 后的呢 ?
C( 客户端 ),S( 服务器 )
这样的话 .C 连接 S 后 .C 与 S 之间就会有一个 Section. 有了这个 Section 之后 . 它们之间的通信才能正常进行 . 但是这个 Secction 是有一个期限的 . 当在这个期限之后 . 就会断开 . 此时服务器是没办法先跟 C 进行通信的 . 当 S 向 C 再发送数据时 ,C 就会把 S 发来的这个数据包丢掉 ( 由路由器来丢弃 ). 当 C 向 S 发数据时 , 此时端口也就变化了 .. 这里面有一个技术 :UDP 穿透 NAPT 技术 . 你在网上找下这方面的文章看一下 . 我在这里就不说了 .( 打字会打得手痛的 .... 呵呵 )
你要保证 C 与 S 之间的连接 , 就要定时的让 C 向 S 发送一个握手包 .
这样就能确保它们之间通信的正常了 .
你是服务器是不是放在公网上 . 而你的客户端是用在内部网的 , 也就是放在 NAPT( 一般都是这个 ) 后的呢 ?
C( 客户端 ),S( 服务器 )
这样的话 .C 连接 S 后 .C 与 S 之间就会有一个 Section. 有了这个 Section 之后 . 它们之间的通信才能正常进行 . 但是这个 Secction 是有一个期限的 . 当在这个期限之后 . 就会断开 . 此时服务器是没办法先跟 C 进行通信的 . 当 S 向 C 再发送数据时 ,C 就会把 S 发来的这个数据包丢掉 ( 由路由器来丢弃 ). 当 C 向 S 发数据时 , 此时端口也就变化了 .. 这里面有一个技术 :UDP 穿透 NAPT 技术 . 你在网上找下这方面的文章看一下 . 我在这里就不说了 .( 打字会打得手痛的 .... 呵呵 )
你要保证 C 与 S 之间的连接 , 就要定时的让 C 向 S 发送一个握手包 .
这样就能确保它们之间通信的正常了 .
楼上说得对哦
.
不知道你那里的情况是多长时间会话到期的
.
通常这个到期时间在不同的网络并不相同
.
据说一两秒到一分钟都有的
.
一般不会的
.
你可以一分钟进行一次握手
.QQ
好像也是
.
你可以试试
.
你上线以后
.
然后把网线给搞掉
.
它差不多要一分钟后才会出现断线的情况