代码如下:procedure TForm3.Button2Click(Sender: TObject);
var
wsData: TWSAData;
h: TSocket; sa: TSockAddr;
buf: PChar;
begin
///
if WSAStartup(MakeWord(2,0), wsData)<>0 then
raise Exception.Create('Cannot use the socket service!'); h := socket(AF_INET, SOCK_DGRAM, 0); FillChar(sa, sizeof(sa), 0);
sa.sin_family := AF_INET;
sa.sin_addr.S_addr := inet_addr('127.0.0.1');
sa.sin_port := 2200;
GetMem(buf, Length(edit1.Text));
Move(PChar(edit1.Text)^, buf^, Length(edit1.Text)); if sendto(h, buf^, Length(edit1.Text), 0, sa, sizeof(sa)) = Length(edit1.Text) then
Showmessage('Send ok!')
else
Showmessage(Format('Error %d', [WSAGetLastError])); WSACleanup;
end;接收端肯定没有问题的,因为我用其它组件做的服务端,
想改用API来做,第一步就走不通,郁闷。。
上面的过程有什么问题吗?
永远都是“Send Ok”但是服务端肯定是没有收到的。
var
wsData: TWSAData;
h: TSocket; sa: TSockAddr;
buf: PChar;
begin
///
if WSAStartup(MakeWord(2,0), wsData)<>0 then
raise Exception.Create('Cannot use the socket service!'); h := socket(AF_INET, SOCK_DGRAM, 0); FillChar(sa, sizeof(sa), 0);
sa.sin_family := AF_INET;
sa.sin_addr.S_addr := inet_addr('127.0.0.1');
sa.sin_port := 2200;
GetMem(buf, Length(edit1.Text));
Move(PChar(edit1.Text)^, buf^, Length(edit1.Text)); if sendto(h, buf^, Length(edit1.Text), 0, sa, sizeof(sa)) = Length(edit1.Text) then
Showmessage('Send ok!')
else
Showmessage(Format('Error %d', [WSAGetLastError])); WSACleanup;
end;接收端肯定没有问题的,因为我用其它组件做的服务端,
想改用API来做,第一步就走不通,郁闷。。
上面的过程有什么问题吗?
永远都是“Send Ok”但是服务端肯定是没有收到的。
Port建议使用htons进行转换
即sa.sin_port := 2200,改为sa.sin_port := htons(2200)
需要用 htons函数。
确实是它的问题,加上后就OK。