奇怪问题,高分(300分)

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

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
请问下面这段代码又什么问题?
为什么accept客户端连接后,客户端还没有发数据,wsarecv就报错:10045?
代码:
procedure TForm1.FormCreate(Sender: TObject);
var
  __wsadt: TWSAData;
begin
   WSAStartup(MAKEWORD(2, 2), __wsadt);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   WSACleanUp;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s, s1, n, l, v: Integer;
  saddr: TSockAddrIn;
  ov: _OVERLAPPED;
  buf: string;
begin
  s := WSASocket(AF_INET, SOCK_STREAM, 0, nil, 0, 1);
  saddr.sin_family := AF_INET;
  saddr.sin_port := htons(10240);
  saddr.sin_addr.S_addr := htonl(INADDR_ANY);
  l := sizeof(saddr);
  bind(s, @saddr, l);
  listen(s, 5);
  while true do
  begin
    s1 := wsaaccept(s, nil, nil, nil, 0);
    setlength(buf, 1024);
    fillchar(ov, sizeof(ov), #0);
    if wsarecv(s1, pwsabuf(integer(buf)-4), 1, cardinal(l), cardinal(n), Pwsaoverlapped(@ov), nil) = SOCKET_ERROR then
    begin
      v := wsagetlasterror;
      showmessage(inttostr(v));
    end
    else showmessage(copy(buf, 1, l));
  end;
end;
 
错误解释:
The attempted operation is not supported for the type of object referenced.
 
没人理你呀?呵呵,问题不奇怪.在下面找
s1 提供的不对
 
这段代码如果用vc实现,是没有什么问题的,请问为何在delphi中实现就不行。
在引用部分是:
uses idwinsock2;
 
to leizengzheng:
s1肯定是正确accept到的socket,请再找找别的原因。
 
我引用的是WinSock2.pas这个单元,在我的机器上这一句就通不过:
s1 := wsaaccept(s, nil, nil, nil, 0);
错误信息:
[Error] Unit1.pas(58): Incompatible types: 'TSockAddrIn' and 'Pointer'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
 
to thx1180:
winsock2是这样的,用idwinsock2就可以通过了。(idwinsock2是indy组件提供的,delphi7)
 
我试了,确实如此,我看了一下idwinsock2的源代码,它对WSAAccept的声明是一个间接的声明,第二个参数addr的类型是PSockAddr,而WinSock2这个参数是TSockAddr类型,看WSAAccept的帮助,这个参数应该是一个指针,只是奇怪怎么会通不过。[:)]

10045号错误:
在WSAAccept中:
WSAEOPNOTSUPP The referenced socket is not a type that supports connection-oriented service.
在WSARecv中:
WSAEOPNOTSUPP MSG_OOB was specified, but the socket is not stream style such as type SOCK_STREAM, out-of-band data is not supported in the communication domain associated with this socket, or the socket is unidirectional and supports only send operations.
 
to thx1180:
谢谢关心,我引用winsock2(从torry下载的)重新写的代码结果一样,应当不是声明的问题。奇怪的是用vc写的话,不管参数随便怎么乱填也不会出现10045这个错 :(

我现在开始怀疑是否是delphi7的问题了。

如果能解决这个问题,我就能给你一份delphi的完成端口控件了。
 
没实践过, 关心!
 
很遗憾,我编译通过了。

可能原因是:我彻底重新安装了indy组件,版本号:9.0.11,而且是他们cvs上的最新版本。
注意安装的时候要彻底,彻底把原来indy的所有dcu,res,bpl删除掉,否则就会有问题。
delphi自带的indy版本有问题,比如chat就通不过,会死掉。重新安装后就会好。
 
编译当然能通过,不过我换用winsock2.pas编译通过后执行结果和用idwinsock2的一样
 
WSAEOPNOTSUPP, "[10045] Operation not supported on socket"
 
后退
顶部