在DELPHI EX2中,分别在两个应用中用了控件TidUDPClient 与TidUDPServer来实现信息的收发。实现在的功能是TidClient发信息后就收。客户端代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
GetBuff:TBytes;
lsstr:string;
begin
setlength(GetBuff,512);
zeromemory(GetBuff,512); IdUDPClient1.Send('127.0.2.1',3030,'ewqefqwe312313');
IdUDPClient1.ReceiveBuffer(GetBuff);
end;
服务端代码如下:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
var
revbuff:array[0..99] of AnsiChar;
lsMsg:AnsiString;begin
lsMsg:= BytesToString(AData);
Memo1.Lines.Add(lsMsg); IdUDPServer1.Send(ABinding.PeerIP,ABinding.PeerPort,lsMsg);end;如果服务端下客户端都开启。通信正常。但如果服务端关闭,客户端就会报错:socket Error #10054 请问高手们,怎样不让客户端出错。也就是说,因为出错了,那TidUDPClient就一定知道服务端没有正常接收信息,在发送之前,怎样判断服务端没有开启或网络不通,从而决定发与不发信息。
delphi socketindyTidUDPClientUDP通信
procedure TForm1.Button1Click(Sender: TObject);
var
GetBuff:TBytes;
lsstr:string;
begin
setlength(GetBuff,512);
zeromemory(GetBuff,512); IdUDPClient1.Send('127.0.2.1',3030,'ewqefqwe312313');
IdUDPClient1.ReceiveBuffer(GetBuff);
end;
服务端代码如下:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
var
revbuff:array[0..99] of AnsiChar;
lsMsg:AnsiString;begin
lsMsg:= BytesToString(AData);
Memo1.Lines.Add(lsMsg); IdUDPServer1.Send(ABinding.PeerIP,ABinding.PeerPort,lsMsg);end;如果服务端下客户端都开启。通信正常。但如果服务端关闭,客户端就会报错:socket Error #10054 请问高手们,怎样不让客户端出错。也就是说,因为出错了,那TidUDPClient就一定知道服务端没有正常接收信息,在发送之前,怎样判断服务端没有开启或网络不通,从而决定发与不发信息。
delphi socketindyTidUDPClientUDP通信
解决方案 »
- Delphi开发的DLL与VC通信问题
- 呵呵,还有400分升星,先放个200分!
- 求16进制转10进制的算法!
- INSERT INTO multi_tab(time) VALUES (#13:54:27#) 错在哪里啊,求救
- 谁有MD5的源程序FOR DELPHI的。
- 紧急情况,在线等待:在窗体A中添加了一个线程单元,并在窗体A uses 上声明了线程单元,但在调试时出现错误如下:Circular unit reference
- 请教大家在线期待ing.
- 我的网站上有一 SQL 数据库 我怎末在客户机上打开读取数据库 直接连接可以吗?
- 实在看不懂了:最外层的循环为什么没有停止?
- ADOConnection,如何保证一个adoconnection在一个事务未完成前不开始新的事务并作出提示?
- W1033 Unit 'GridsEh' implicitly imported into package 'EhLib110'
- delphi 如何判断游戏或电影的全屏状态
你想过滤掉socket Error #10054 信息,用try...except...end拦截。
这是微软的解释,还提供了解决方案
"下面的代码段演示可用于调用的方法与 SIO_UDP_CONNRESET 控件代码 WSAIoctl 以获取原始的 WindowsNT 4.0 行为。
DWORDdwBytesReturned = 0;
BOOLbNewBehavior = FALSE;
DWORDstatus;// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(sd, SIO_UDP_CONNRESET,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned,
NULL, NULL);if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return(FALSE);
}
else
{
printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr);
return(FALSE);
}
}
若要能够编译此代码,您需要既有最新的其中包括定义的 SIO_UDP_CONNRESET,或者插入下面的 Mswsock.h它的直接插入代码的定义。
// MS Transport Provider IOCTL to control
// reporting PORT_UNREACHABLE messages
// on UDP sockets via recv/WSARecv/etc.
// Path TRUE in input buffer to enable (default if supported),
// FALSE to disable.
#defineSIO_UDP_CONNRESET_WSAIOW(IOC_VENDOR,12)