请教一个关于完成端口的连接请求时候的验证问题

山娃马小三儿 2010-12-06 08:53:29
初次使用完成端口,有很多不懂的地方,请大侠们指导指导。以前一直用delphi自带的控件ServerSocket,此控件提供了一个OnAccept事件,可以在这个事件里,来得到连接的客户端信息,比如客户端地址、端口号,和所谓的注册包(连接建立是发送过来的字符串)信息,通过这些信息来判断客户端的合法性,以决定是允许此连接还是拒绝此连接。现在开始用完成端口写,高了半天也不知道从那里来得到这些信息,有人说用getpeername可以得到客户端的ip和端口号信息,用tcp/ip的外带数据可以实现注册包的方式,但是具体不知道如何操作,希望在连接和完成端口建立关联之前实现此认证操作。请了解的提供帮忙,不胜感激
 while True do
begin
Acceptsc :=WSAAccept(Listensc, Nil, Nil, Nil, 0);
if Acceptsc =SOCKET_ERROR then
begin
closesocket(Listensc);
Exit;
end;
//感觉应该在这个地方加入对Acceptsc 的验证
end;
...全文
208 点赞 收藏 20
写回复
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaofang1861 2010-12-18
var
NS: Integer;
Addr: SOCKADDR_IN;
AddrLen: Integer;

Host: Longword;
Port: Word;
while True do
begin
AddressLen := SizeOf(Address);
NS := WSAAccept(TcpServer.Socket, @Addr, @AddrLen, nil, 0);
if NS = INVALID_SOCKET then
begin
Break;
end;
Host := htonl(Address.sin_addr.S_addr);
Port := Address.sin_port;
end;

回复
[Quote=引用 17 楼 xhz2000 的回复:]
这样代码倒是可以接受注册包了,(把注册包当成客户端发送的一条数据来接受),接收后再处理完成端口的初始化工作,但是对于不发送注册包的设备,就一直停止在recv事件了

***********请问客户端是什么时候发送带外数据? 是客户端连接上就发送还是怎么发送才适合?? *********
[/Quote]
发送连接请求的时候一起发送吧应该是,在用serversocket控件写程序的时候,我是在onaccept事件里接收到数据的,所以感觉是在发送请求的时候发送的,具体详情也不是很清楚了,客户端是一个硬件,比如现在用的gprs模块,一般都是这样的,有一个注册包的概念
回复
xhz2000 2010-12-13
这样代码倒是可以接受注册包了,(把注册包当成客户端发送的一条数据来接受),接收后再处理完成端口的初始化工作,但是对于不发送注册包的设备,就一直停止在recv事件了

***********请问客户端是什么时候发送带外数据? 是客户端连接上就发送还是怎么发送才适合?? *********
回复
if Acceptsc =SOCKET_ERROR then
begin
closesocket(Listensc);
Result :=6;
Continue;
end;
//***********************获取客户端IP地址和端口号 **************
FillChar(ClientIPAddress, Length(ClientIPAddress), #0);
StrMove(ClientIPAddress, inet_ntoa(sti.sin_addr), Length(ClientIPAddress));
ClientPort :=ntohs(sti.sin_port);
//***********************获取注册字符串*************
FillChar(RegisterStr, Length(RegisterStr), #0);
if Recv(Acceptsc, RegisterStr, Length(RegisterStr), MSG_OOB) <>0 then
begin;
end;

这样代码倒是可以接受注册包了,(把注册包当成客户端发送的一条数据来接受),接收后再处理完成端口的初始化工作,但是对于不发送注册包的设备,就一直停止在recv事件了
回复
带外数据,带外数据
回复
robin_lee 2010-12-10
什么应用,非要用IOCP吗?如果客户端不多,用Winsocket就够啦吧?
回复
lyf_qin1010 2010-12-09
学习,一直都想弄明白完成端口,可一直没去研究
回复
Think-In-C 2010-12-09
学习中,感觉你可以先休息一天,或许问题就解决了,你压力太大了。
想必,没你想得那么麻烦。
回复
坐等回帖
回复
xhz2000 2010-12-07
关注一下!
回复
haitao 2010-12-07
完成端口 与 delphi自带的控件ServerSocket 机制不一定类似吧
回复
zhaodog 2010-12-06
1\ 用WSAAccept接受到socket
getpeername(FSocket, SockAddrIn, Size)
inet_ntoa(SockAddrIn.sin_addr) 连接socket的ip地址
ntohs(SockAddrIn.sin_port) 连接socket的端口


2、用acceptex接受
GetAcceptExSockAddrs分析缓冲区
GetAcceptExSockAddrs(@AOperation.FBuffer.AcceptExBuffer[0],0,
SizeOf(TSockAddr) + 16, SizeOf(TSockAddr) + 16,tLocalAddr,iLocalAddrLen,
tRemoteAddr,iRemoteAddrLen );

可得地址和端口
回复
zhaodog 2010-12-06
1\ 用WSAAccept接受到socket
getpeername(FSocket, SockAddrIn, Size)
inet_ntoa(SockAddrIn.sin_addr) 连接socket的ip地址
ntohs(SockAddrIn.sin_port) 连接socket的端口


2、用acceptex接受
GetAcceptExSockAddrs分析缓冲区
GetAcceptExSockAddrs(@AOperation.FBuffer.AcceptExBuffer[0],0,
SizeOf(TSockAddr) + 16, SizeOf(TSockAddr) + 16,tLocalAddr,iLocalAddrLen,
tRemoteAddr,iRemoteAddrLen );

可得地址和端口
回复
zhaodog 2010-12-06
1\ 用WSAAccept接受到socket
getpeername(FSocket, SockAddrIn, Size)
inet_ntoa(SockAddrIn.sin_addr) 连接socket的ip地址
ntohs(SockAddrIn.sin_port) 连接socket的端口


2、用acceptex接受
GetAcceptExSockAddrs分析缓冲区
GetAcceptExSockAddrs(@AOperation.FBuffer.AcceptExBuffer[0],0,
SizeOf(TSockAddr) + 16, SizeOf(TSockAddr) + 16,tLocalAddr,iLocalAddrLen,
tRemoteAddr,iRemoteAddrLen );

可得地址和端口
回复
keeley20 2010-12-06
Server和Client端可以相互通讯吗?如果可以,接收数据的时候自己判断数据包是否合法 。
回复
Accept之后应该就是连接上了把,我想在Accept之后,在与完成端口建立关联之前,进行处理
回复
bdmh 2010-12-06
首先要连上啊,那样才能发送验证信息
回复
现在客户端的IP地址和端口号都能得到了
下面一步,怎们能得到注册包的信息呢。
keeley20 说的方法不是不可行,但是这样处理的话,就要在每次通讯受到包的时候都去判断一次,很频繁的通讯开销太大,另外,我要通过注册信息判断出是哪个连接上来的,好对应词连接做一些初始化工作。想再建立连接的时候判断完毕,以后就是可信任的连接了,就不在做判断了,所以最好还是在跟完成端口绑定之前做比较好
回复
发动态
发帖子
网络通信/分布式开发
创建于2007-08-02

1565

社区成员

Delphi 网络通信/分布式开发
申请成为版主
社区公告
暂无公告