添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

这个问题缠绕了我很长一段时间,现在问题解决了,总结一下,在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;

要求是:设备与主机之间是 UDP 通信,当刷新设备时,需要释放 socket 资源,然后再新建 socket 资源。(没有设置 socket 的地址重用属性,因为要防止会带来其他的隐患,比方说接收到旧的错误消息) sock为类成员变量 port也为类成员变量 (一些错误校验都省略了) 第一个版本: bool Init Socket ()      sock = socket (AF_INE
开始我把绑定的端口放在了创建的接收信息函数 ,导致运行报错 10022 , 问题 正是 出现 在这个地方,绑定的端口应该设置为全局的变量( udp _ socket .bind((’’, 8088))),因为套接字收发都会用到绑定的端口,将绑定的端口作为变量放到全局 ,就可以解决代码的报错,以下是正确代码,如有其它高见,欢迎大神指点。 longlastingaim: 跪求高手指教: 本人在哈萨克斯坦的中哈合资油田工作,现遇到一有关PLC通讯的难题:美国卡特发动机驱动压缩机由AB plc控制 ,框架有一1747-KE通讯接口模块,PORT1负责和独立的发动机控制装置ECM(engine control module)通讯,但有故障,通讯不上,总是亮黄色错误指示灯,port2负责和监控室上位机通信,此端口通讯正常,控制柜触摸屏只显示压缩机的各项参数,不显示发动机的所有参数,远程监控室也只上传压缩机数据,发动机数据全部显示为0. 望高手指点。问题解决后可支付一定报酬,QQ号1005004196,云中漫步。高手加我后发详细资料给你。 MoxaNP5110使用手记 darnis: 这是可以的,不然我们工业用的只有串口通讯的PLC怎么通讯啊。它的管理软件NPort Administrator,做了映射之后,等于是在你的PC端安了虚拟串口。 我刚拿到货的时候,也是用 串口调试助手 来测试的,是正常的。