c/s结构下,怎样获得当前用户(客户端)的IP地址?谢谢!

gostesee 2003-08-26 10:41:27
c/s结构下,怎样获得当前用户(客户端)的IP地址?请给出源代码或数据库,谢谢!我的邮箱 chxjmail@btamail.net.cn
...全文
80 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
briliang 2003-08-29
  • 打赏
  • 举报
回复
我单位很需要lotus安全监控的产品,可以联系吗?
briliang@sina.com
gostesee 2003-08-27
  • 打赏
  • 举报
回复
呵呵,解决了,向ntko(磁化水)学习,也谢谢楼上各位。
ntko 2003-08-26
  • 打赏
  • 举报
回复
有关dsapi你可以看一下相关文档,去ibm搜索lotus c API reference和userguide,
讲的比较详细。
但是,如果要完成你的功能,我建议你没必要写API,
可以在as400上通过ip协议来配置,不知可否?

因为我们有一个产品是关于lotus 安全的,可惜是在win2k上运行的,能够实现你说的功能,
还可以限制某人只能在某台机器上使用客户端,这样就必须写API了。

只是我不太方便公开源代码。
gostesee 2003-08-26
  • 打赏
  • 举报
回复
请ntko(磁化水)讲述大概api使用,我只知道得到客户端机器名称,可怎样把机器名称转化成ip呢?
gostesee 2003-08-26
  • 打赏
  • 举报
回复
domino运行在as400上,想获得客户端ip运用是防止不是局域网内部机器就不允许访问数据库,即使拥有合法的id也不行。
ntko 2003-08-26
  • 打赏
  • 举报
回复
这个问题用一个Notes数据库是解决不了的。必须使用DSAPI来解决。
请具体描述一下你的应用。
ntko 2003-08-26
  • 打赏
  • 举报
回复
或者:
以下代理可以获得客户端IP地址,并将其放到选中文档的IPadddress域:
mport lotus.domino.*;
import java.net.*;

public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here)
Document doc = agentContext.getDocumentContext();
if (doc != null)
{
InetAddress local = InetAddress.getLocalHost();
doc.replaceItemValue("IPAddress", local.getHostAddress());
doc.save();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
ntko 2003-08-26
  • 打赏
  • 举报
回复
daluoboequalto(大萝卜) :你有其它方法吗?
chenyg2000(icerain) :C/S方式用Java代理不能实现。

gostesee () :下面代码仅供参考(win2k下的)

首先注册一个事件:
STATUS LNPUBLIC MainEntryPoint(void)
{
STATUS err;

err = EMRegister( EM_SECAUTHENTICATION,
EM_REG_AFTER,
ExtCallback,
0, ®EMId1);

return err;

}

下面是事件回调函数:(当Notes客户端链接时发生)
STATUS LNPUBLIC ExtCallback( EMRECORD FAR * theData )
{
VARARG_PTR argPtr;
STATUS sError = ERR_EM_CONTINUE;

argPtr = theData->Ap;

/* do nothing if there is an error. */
if ( theData->Status )
{
return theData->Status;
}


switch (theData->EId)
{

case EM_SECAUTHENTICATION:

/* declare the arguments */

WORD wEvent = 0;
SESSIONID SessionId;
char *pRemoteName = NULL;
DWORD dwFlags = 0;
WORD wNetProtocol = 0;
char *pNetAddress;

/* get the arguments */

wEvent = VARARG_GET( argPtr, WORD );
SessionId = VARARG_GET( argPtr, SESSIONID );
pRemoteName = VARARG_GET( argPtr, char far * );
dwFlags = VARARG_GET( argPtr, DWORD );
wNetProtocol = VARARG_GET( argPtr, WORD );

//若上面的协议为TCPIP,此处pNetAddress 就是客户的IP地址
pNetAddress = VARARG_GET( argPtr, char far * );


/* for this example, only process post Domino Authentication */
if (theData->NotificationType != EM_AFTER)
break; /* break out of here */

/* switch on types of wEvent */
switch (wEvent)
{

/* additional authentication code goes here */
case AUTHEM_StartAuthentication:

if (dwFlags & fAuthRoleServer)
{

/* protocol processing... */
switch (wNetProtocol)
{
case PROTOCOL_TCP:
//你要实现的功能在这儿,pRemoteName是用户名,pNetAddress是用户IP地址
处理函数(pRemoteName,pNetAddress);
break;
default:
break;
}
}
sError = ERR_EM_CONTINUE;
break;
default:
sError = ERR_EM_CONTINUE;
break;
}

} /* END SWITCH */
return( sError );
}

要将这些函数(还有其它一些必须的函数,具体参阅API资料)
编译为DLL,并且在服务器的notee.ini文件中加入
EXTMGR_ADDINS=你的DLL

这样,每次用户从Notes Client登录都会调用你的函数了。
chenyg2000 2003-08-26
  • 打赏
  • 举报
回复
可以通过java代理实现
daluoboequalto 2003-08-26
  • 打赏
  • 举报
回复
7
一、物理架构说明 游戏系统组件包括: 服务器系统(中心服务器控制系统,服务器登陆控制系统,游戏登陆服务器,游戏房间控制系统,游戏组件系统),游戏客户端(游戏大厅,游戏组件)。 数据库系统:用于保存用户信息数据、游戏积分数据、游戏系统运行状态数据,系统日志数据等数据。 中心服务器控制系统:用于向客户端提供全局配置,初始化数据使用。 服务器登陆控制系统:用于房间服务控制系统登陆效验使用。 游戏房间控制系统:用于控制游戏房间的启动,停止,添加,删除,管理等。 游戏组件系统:用于具体游戏服务,被游戏房间控制系统挂接,提供游戏服务。 游戏大厅:游戏玩家连接游戏使用。 二、系统结构 系统选用的开发工具是优秀的Microsoft Visual C++.net2003,系统采用客户端/服务器(C/S)编程模式,TCP/IP协议作为客户端和服务器的通信网络层,运用具有性能最优的完成端口(IOCP:Input/Output Completion Port )网络开发模型搭建服务器软件.客户端采用WinSocket API作为网络层。 系统采用多服务器分布式架构,由一个中心服务器(CENTERSERVER),多个主服务器(MainServer)和多个从服务器(LocalServer)同时工作以实现游戏逻辑和用户管理及通讯的功能。中心服务器向客户端提供全局配置,初始化数据(主要是定位一个主服务器IP地址),主服务器管理客户端用户身份验证、登录以及管理从服务器的建立,由多个从服务器管理游戏通信,大厅及房间,从服务器可任意添加、删除、修改等。 网络棋牌游戏服务器架构全文共7页,当前为第1页。系统首先启动中心服务器(CENTERSERVER), 中心服务器从INI文件中读取MainServer列表信息, 客户端提供全局配置,初始化数据,然后等待客户联结, 客户联结后CENTERSERVER定位一个MainServer的IP地址和端口号,发往客户端, 客户端收到后断开CENTERSERVER的联接,并马上用MainServer的IP地址和端口号,和主服务器(MainServer)连接.主服务器从数据库中读取从服务器的所有信息到主服务器的内存。首先读取ComType表以建立所有的游戏类型的基本信息,然后读取ServiceInfo(界面树结点信息表)以获得包括客户端界面结构、从服务器的信息、大厅和房间的一切信息。当有客户端请求登录并成功和主服务器连接的时候,主服务器将这所有的信息一次性发到客户端内存,客户端根据这些信息生成界面结构树。 网络棋牌游戏服务器架构全文共7页,当前为第1页。 主服务器启动后还可以在主服务器里创建多个从服务器及房间,创建完成后从服务器的IP地址及端口号就作为它的唯一标识被同时写进数据库和主服务器的内存;房间号、房间所属的游戏类型、所属的从服务器号也作为房间的唯一标识被同时写进数据库和主服务器的内存。 从服务器创建以后就在它所属的机器上启动。 客户端登录后首先和主服务器建立连接(并且一直到客户端退出才断开)连接成功后生成界面结构树(前述),当用户点击某个游戏房间的时候系统从内存中读出这个房间的所有信息(前述),根据房间所属从服务器的IP地址及端口号试图和这个从服务器建立连接,连接成功后相应的从服务器就将这个房间的所有信息发到这个客户端客户端收到以后就根据这些信息生成房间。每当有客户端的游戏位置发生改变的时候就向从服务器发送改变信息,从服务器保存、修改所有与它连接的客户端的位置信息列表。 当一张桌子坐满时游戏开始。游戏开始后客户端也是和从服务器通信以更新游戏信息。 当客户端退出游戏后就回到大厅的这个房间,当退出大厅的时候首先和从服务器断开连接,然后和主服务器断开连接,最后终止整个客户端程序。 三、模块结构 系统包括三大主要模块结构:MainServer,LocalServer,Com.此外还有客户端安装,更新模块等。在三大主要模块结构中还有子DLL(动态链接库)模块。 1、MainServer(EXE项目):封装主服务器功能,包括管理客户端用户身份验证、登录以及管理从服务器的建立,数据库读写等。 2、LocalServer(EXE项目):封装从服务器功能,包括管理客户端游戏通信,游戏逻辑,大厅及房间等。 3、Com(EXE项目):封装客户端所有功能,包括客户端登录,大厅及房间,客户端游戏通信,游戏逻辑等。Com包括以下子模块: 客户端通用库PubLib(DLL模块)封装了客户端通用的调用接口,控件,类。供客户端所有的模块调用. 麻将游戏通用库MJLib(DLL模块)封装了客户端麻将游戏通用的调用接口类和十堰麻将类。通用的调用接口类供特殊的麻将游戏模块调用。 网络棋牌游戏服务器架构全文共7页,当前为第2页。扑克牌游戏通用库PisaLib(D
DNS 服务器程序 实验报告 系统和运行环境描述 Windows7 操作系统平台,VS2010 编程环境。 使用 C/C++编写 dns 中继服务器。 系统功能设计 设计 DNS 服务器程序,读入 域名-IP 地址 对照表,当客户端查询域名对应的 IP 地址时,用域名检索该对照表,有三种检索结果: (1)检索结果为 ip 地址 0.0.0.0,则向客户端返回 域名不存在 的报错消息 (不良网站拦截功能) (2)检索结果为普通 IP 地址,则向客户返回这个地址(服务器功能) (3)表中未检到该域名,则向因特网 DNS 服务器发出查询,并将结果返给客户 端(中继功能) 。 需要考虑的问题: (1)多客户端并发 允许多个客户端(可能会位于不同的多个计算机)的并发查询,即:允许第一个 查询尚未得到答案前就启动处理另外一个客户端查询请求(DNS 协议头中 ID 字 段的作用) 超时处理 (2)由于 UDP 的不可靠性,考虑求助外部 DNS 服务器(中继)却不能得到应答 或者收到迟到应答的情形。 主要数据结构 主要的全局的数据结构定义在 dns.h 的头文件中。 struct req_inform{ struct sockaddr_in cli_addr; unsigned short id; };//id和 cli_addr 唯一标识一个DNS请求 该结构唯一标示了一个来自客户端的 dns 请求。 map url_ip_table; 用来构建本地存储的 url_ip_table.txt 中域名和 IP 的映射。 map req_cache[cache_num]; 这一个 map 映射,把客户端 dns 请求映射到一个 unsigned short 上面,用它来 存储 id 转换表。另外和 id 转换表相关的参数是如下: #define cache_num 3 #define cache_size 1000 int cur_cache=0; int idThen_max=cache_num*cache_size; int idThen=0; cache_num 指定了 id 转换表的个数,cache_size 是每个 id 转换表的大小, cur_cache 指向是当前正在装入的 id 转换表, idThen 是一个从 0 到 0xFFFF 一直 循环的被映射到的 id 号。 这个设计的作用是代替了时间戳,而且可以根据实际情况来指定 id 转换表缓存 的大小。 具体流程是: 生成 id 转换的 item(idThen,struct req_inform 的一个变量) 把 id 转换的 item 加入到 req_cache[cur_cache]中 如果 req_cache[cur_cache]已经达到 cache_size{ cur_cache 指向下一个 id 转换表,并将其清空 } idThen 加 1 具体实现在 dns_fuc.cpp 的 ask_next_server 函数中。 int sockfd; struct sockaddr_in ser_addr,nser_addr; sockfd 是一个绑定到 ser_addr(dns 服务器本机 53 号端口)的一个 socket 描述 符,用它来进行 udp 报文传输。 ser_addr 初始化为本地 53 号端口的地址, nser_addr 是上级服务器的 53 号端口 (中继功能时使用) 。 const char * nx_ip="211.68.71.4";//保存上级服务器的 ip const char * file_name="C:/Users/Administrator/Desktop/dns/dns/url_ip_table.txt"; //保存 url_ip_table.txt 的路径 struct dns_ans_add{ unsigned short url_pointer; unsigned short type; unsigned short clas_s; unsigned short time1; unsigned short time2; unsigned short sourse_size; unsigned int sourse; }; 这个是与 dns 请求相比 dns 响应追加部分。 模块划分 int get_url_ip_table( map& table); 用来从文件中读入 url_ip_table。 int init(); 用来初始化 ser_addr、nser_addr、sockfd,以及对 sockfd 绑定

535

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 Exchange Server
社区管理员
  • 消息协作社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧