问题:

在使用线程池处理客户端请求时发现不能获取到客户端的ip!

原因:

    由于在server_loop注循环中只把连接字sock加到queue队列中,并没有客户端IP,所以每一次queue回调函数只能取得sock连接字,没有客户端的ip

解决方法:
    在将sock加入queue队列的同时把ip也加入到ips队列中,ips队列的长度和queue相同,而且存的数据下标要相同,取sock处理时也把IP取出来,即可得到了客户端IP

步骤:
    定义全局保存IP地址的变量
    static unsigned long ips[MAX_QUEUE];

    修改 enqueue函数
int enqueue(SOAP_SOCKET sock,unsigned long ip)//添加ip的参数
{
int status = SOAP_OK;
int next;
int ret;
if ((ret = MUTEX_LOCK(queue_cs)))
fprintf(stderr, "MUTEX_LOCK error %d\n", ret);
next = (tail + 1) % MAX_QUEUE; //1000
if (head == next)
{
/* don't block on full queue,
* 队列已满,return SOAP_EOM */
status = SOAP_EOM;
}
else
{
queue[tail] = sock;
ips[tail] = ip; //保存ip
tail = next;
if ((ret = COND_SIGNAL(queue_cv)))
fprintf(stderr, "COND_SIGNAL error %d\n", ret);
}
if ((ret = MUTEX_UNLOCK(queue_cs)))
fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret);
return status;
}

    添加dequeue_ip()函数
unsigned long  dequeue_ip()
{
unsigned long ip;
int num=0;
if(head == 0)
num = MAX_QUEUE - 1;
else
num = head -1;
ip = ips[num];
return ip;
}


修改queue回调函数函数
void *process_queue(void *soap)
{
struct soap *tsoap = (struct soap*)soap;
for (;;)
{
tsoap->socket = dequeue();
tsoap->ip = dequeue_ip();//获取相应的ip地址
if (!soap_valid_socket(tsoap->socket))
{
#ifdef DEBUG
fprintf(stderr, "Thread %d terminating\n", (int)(long)tsoap->user);
#endif
break;
}

解决!

测试:
在http_get_handler函数中测试

int http_get_handler(struct soap *soap)

。。。。。
fprintf(stderr, "Request accepts connection from IP %d.%d.%d.%d\n",
(int)(soap->ip>>24)&0xFF, (int)(soap->ip>>16)&0xFF,(int) (soap->ip>>8)&0xFF, (int)soap->ip&0xFF);
。。。。。。
}

输出:
Request accepts connection from IP 192.168.1.136
Request accepts connection from IP 192.168.1.136
Thread 3 finished serving request with failure 404
Error 404 fault: SOAP-ENV:Client [no subcode]
"HTTP Error: 404 Not Found"
Detail: [no detail]
Request accepts connection from IP 192.168.1.87
Request accepts connection from IP 192.168.1.87
Request accepts connection from IP 192.168.1.87

gsoap:实现线程池处理时获取到客户端的ip的更多相关文章

  1. 怎么使用PHP获取用户客户端真实IP的解决方案呢?

    function getIp(){if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIE ...

  2. PHP获取APP客户端的IP地址的方法

    分析php获取客户端ip 用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ func ...

  3. PHP获取用户客户端真实IP的解决方案是怎样呢?

    function getIp(){if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIE ...

  4. Nginx 反向代理时获取用户的真实 IP

    在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址:还有广告系统里面,也是需要获取用户的 IP 地 ...

  5. io流+网络+线程池 实现简单的多客户端与服务器端通信

    1 import java.io.IOException; 2 import java.io.InputStream; 3 import java.io.OutputStream; 4 import ...

  6. PHP获取远程客户端真实IP的办法!

    (1).REMOTE_ADDR:浏览当前页面的用户计算机的ip地址 (2).HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关 (3).HTTP_CLIENT_IP:客户端的i ...

  7. X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)

    https://help.aliyun.com/knowledge_detail/13051859.html?pos=1 1.IIS 6 配置方案2.IIS 7 配置方案3.Apache 配置方案4. ...

  8. javase-->多线程--线程池

    java的线程池理解 在面向对象编程中,对象创建和销毁是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. ...

  9. java并发编程(十七)Executor框架和线程池

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17465497   Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动 ...

随机推荐

  1. 登录记住账号和密码小Demo

    读取 // 1.读取沙盒中plist文件 // 1.1.获得沙盒根路径 NSString *home = NSHomeDirectory(); // 1.2.拼接Documents路径 NSStrin ...

  2. Floodlight 在 ChannelPipeline 图

    我们知道,在Netty架构,一个ServerBootstrap用于生成server端的Channel的时候都须要提供一个ChannelPipelineFactory类型的參数,用于服务于建立连接的Ch ...

  3. mysql设置root的密码

    mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

  4. 增加 Java 有几个好习惯表现

    以下是一些参考网络资源中的摘要Java编程在一些地方尽可能做. 1. 尝试使用单个例如在合适的场合 使用单例可以减轻负荷的负担,缩短加载时间.提高装载效率,但并不是所有的地方都适合一个案例.简单的说, ...

  5. ubuntu安装nVidia驱动,遇到终端闪砾问题并解决

    安装nvidia的官方驱动之后,比起nouvean来说感觉速度快了不少. 安装该驱动很简单,但选择哪个驱动是要注意的.因为今天我试了nvidia的多个驱动后都在ubuntu下用起来并不好. 我现在的环 ...

  6. mysql基础之存储引擎

    原文:mysql基础之存储引擎 数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎 常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量 ...

  7. C语言JSON-RPC

         近期对json-rpc比較感兴趣,思想非常easy,并且看到了非常多不同语言的实现.在github上 hmngomes 的 json-rpc-c (实现的是server端,基于TCP流),短 ...

  8. QTP DataTable全攻略(1)

    上一篇 / 下一篇  2009-07-27 00:14:16 / 个人分类:qtp 查看( 575 ) / 评论( 0 ) / 评分( 0 / 0 ) 下面的代码可能有点乱,基本涉及到常用的datat ...

  9. String的使用

    String的常用方法 方法 说明 Anchor() 创建html锚 Concat() 把字符串连接起来 indexOf() 查找字符出现的位置 lastIndexOf() 查找最后出现字符 char ...

  10. Linux系统编程:dup2()重定向

    对于Dup2 的理解: 源代码: #include <unistd.h> #include <stdio.h> #include <stdlib.h> #inclu ...