大家看看这段代码有什么问题,有关delphi中winsock api编程的。(100分)

  • 主题发起人 主题发起人 anzhiping
  • 开始时间 开始时间
A

anzhiping

Unregistered / Unconfirmed
GUEST, unregistred user!
var
x:Tsocket;
selfaddr,theiraddr:Tsockaddr;
tos:char;
buf:array [1..100] of byte;
i:integer;
p:integer;

begin
for i:=1 to 100 do
buf:=i;
x:=socket(AF_INET,SOCK_DGRAM,0);
selfaddr.sin_family :=AF_INET;
selfaddr.sin_port:=htons(6000);
selfaddr.sin_addr.S_addr:=htonl(INADDR_ANY);
bind(x,selfaddr,sizeof(Tsockaddr));
theiraddr.sin_family:= AF_INET;
theiraddr.sin_port :=htons(6000);
theiraddr.sin_addr.S_addr:=htonl(inet_addr('202.117.15.170'));

tos:=chr(30);
setsockopt(x,SOL_SOCKET,IP_TOS,@tos,sizeof(byte));
p:=sendto (x,buf,100,0,theiraddr,sizeof(theiraddr));
// if p>0 then
showmessage(inttostr(p));
closesocket(x);
end;

在发送分组后,返回结果为-1,没有发送成功,为什么。
 
前面的socket和bind都成功了吗。
 
如果不打算接收数据,需要bind吗
 
跟踪了一下,
发现x:=socket(AF_INET,SOCK_DGRAM,0);
的返回就错了,返回-1。
改成
x:=socket(AF_INET,SOCK_DGRAM,AF_INET);
也不行。

大家都来看看,怎么回事。
 
procedure InitWsocket;
var
aWSAData: TWSAData;
begin
if WSAStartup($202, aWSAData) <> 0 then
begin
MessageBox(0, //GetForegroundWindow(),
'本程序需要WINSOCK2,该机上版本太低,请升级' +
'WINSOCK到WINSOCK2',
'错误',
MB_ICONERROR);
end;
end;

procedure FreeWsocket;
begin
if WSACleanup <> 0 then
begin
MessageBox(0,
'清除WS2_32.DLL失败!',
'错误',
MB_ICONERROR);
end;
end;

initialization
InitWsocket;

finalization
FreeWsocket;

end.

很简单呀,没有初始化winsock.dll
 
to 张无忌:

加上初始化之后还是不行啊!
 
socket函数的第三个参数是不是有问题,应该是这个吧IPPROTO_UDP
 
继续问:
按照powernet的说法修改,可以发送分组了。
去掉初始化,也可以发送。
但是,tos确没有修改掉。为什么呀。


注册表我已经改过了。ping数据包的tos已经可以改了。
 
setsockopt函数返回结果是-1,不知道为什么
 
setsockopt(x,ipproto_ip,IP_TOS,@tos,sizeof(byte));
 
Ok,搞定了。谢谢大家。
 
后退
顶部