SOCKET UDP 通讯过程中 10022 和 10014 偶尔出现问题
2006-09-06 16:18
591 查看
这个问题缠绕了我很长一段时间,现在问题解决了,总结一下,在SOCKET API调用时,一些需要注意的问题。
WINSOCK2 里面跟 SOCKADDR 相关的调用都需要使用指针形式,并且这个SOCKADDR的长度也需要一个指向Integer的指针参数。
通常情况下在调用 recvfrom 时(下面是原型声明),如果 SOCKADDR 参数的长度信息(fromlen)没有指定长度的话(未初始化),会偶发性地产生10022(提供了一个无效的参数)和 10014 错误。
function recvfrom( const s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; fromlen: PInteger ): Integer; stdcall;
下面贴一段接收处理的代码:
var
sa: PSockAddr;
iLen: integer;
t1: integer;
fd_read : PFDSet;
timeout : PTimeVal;
strTmp: string;
begin
Result := 0;
t1 := GetTickCount;
new(fd_read);
new(timeout);
try
FD_ZERO(fd_read^);
FD_SET(FHandle, fd_read^);
timeout^.tv_sec := aTimeOut div 1000;
timeout^.tv_usec := 1000 * (aTimeOut mod 1000);
if select(FHandle + 1, fd_read, nil, nil, timeout) > 0 then
begin
if FD_ISSET(FHandle, fd_read^) then
begin
new(sa);
/// 长度必须指定,初始化正确的值否则的话就容易出现 10022 和 10014 的错误
iLen := SizeOf(sa^);
FillChar(sa^, iLen, 0);
try
Result := idWinSock2.recvfrom(FHandle, oBuffer, aBufferSize, 0, sa, @iLen);
if Result <> SOCKET_ERROR then
begin
fromIP := string(inet_ntoa(sa^.sin_addr));
fromPort := ntohs(sa^.sin_port);
end else
begin
Result := 0;
end;
finally Dispose(sa); end;
end;
FD_CLR(FHandle, fd_read^);
end;
finally Dispose(fd_read); Dispose(timeout); end;
end;
WINSOCK2 里面跟 SOCKADDR 相关的调用都需要使用指针形式,并且这个SOCKADDR的长度也需要一个指向Integer的指针参数。
通常情况下在调用 recvfrom 时(下面是原型声明),如果 SOCKADDR 参数的长度信息(fromlen)没有指定长度的话(未初始化),会偶发性地产生10022(提供了一个无效的参数)和 10014 错误。
function recvfrom( const s: TSocket; var Buf; len, flags: Integer; from: PSockAddr; fromlen: PInteger ): Integer; stdcall;
下面贴一段接收处理的代码:
var
sa: PSockAddr;
iLen: integer;
t1: integer;
fd_read : PFDSet;
timeout : PTimeVal;
strTmp: string;
begin
Result := 0;
t1 := GetTickCount;
new(fd_read);
new(timeout);
try
FD_ZERO(fd_read^);
FD_SET(FHandle, fd_read^);
timeout^.tv_sec := aTimeOut div 1000;
timeout^.tv_usec := 1000 * (aTimeOut mod 1000);
if select(FHandle + 1, fd_read, nil, nil, timeout) > 0 then
begin
if FD_ISSET(FHandle, fd_read^) then
begin
new(sa);
/// 长度必须指定,初始化正确的值否则的话就容易出现 10022 和 10014 的错误
iLen := SizeOf(sa^);
FillChar(sa^, iLen, 0);
try
Result := idWinSock2.recvfrom(FHandle, oBuffer, aBufferSize, 0, sa, @iLen);
if Result <> SOCKET_ERROR then
begin
fromIP := string(inet_ntoa(sa^.sin_addr));
fromPort := ntohs(sa^.sin_port);
end else
begin
Result := 0;
end;
finally Dispose(sa); end;
end;
FD_CLR(FHandle, fd_read^);
end;
finally Dispose(fd_read); Dispose(timeout); end;
end;
相关文章推荐
- 微信支付使用过程中出现不稳定、偶尔超时的问题
- socket 编程UDP通讯问题
- sqoop的使用过程出现的问题
- MySQL安装过程中出现的问题
- cygwin安装hadoop过程中出现的2个问题
- ubuntu下整合eclipse和tomcat的过程以及可能出现的问题
- 解决android sdk 运行出现 could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037:的问题
- j2me的socket通讯问题
- Deep Learning 之 训练过程中出现NaN问题
- 服务器产生大量CLOSE_WAIT状态的socket问题的排查过程
- float类型做为参数传递过程中出现的问题
- response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
- 从下载NodeJs开始到引入express模块最全的安装过程以及出现的所有问题
- 开发过程中出现的代码规范问题
- JAVA与网络开发(TCP:Socket、ServerSocket;UDP:DatagramSocket、DatagramPacket;多线程的C/S通讯、RMI开发概述)
- 手写JAVA NIO实现Socket通信及其过程中注意的问题
- 创建链接服务器出现“解密过程中出错”问题
- linux socket 通信, 服务器端bind socket出现address already in use问题
- TCP加密通讯附记,实践中出现的问题。
- 配置SVN过程中出现的问题