问题:

在使用线程池处理客户端请求时发现不能获取到客户端的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. iframe的各项參数

    iframe的各项參数: <iframe src="test.jsp" width="100″ height="50″ frameborder=" ...

  2. MVC验证13-2个属性至少输入一项

    原文:MVC验证13-2个属性至少输入一项 有时候,我们希望2个属性中,至少有一个是必填,比如: using Car.Test.Portal.Extension;   namespace Car.Te ...

  3. 三星GT-S7572换屏幕教程

    家里人手机被摔坏了,尽管不是什么值钱的手机.可是自从上了大学之后,就一直认为赚钱真的非常不easy,不到逼不得已,就不要乱花钱.于是,就从淘宝上买了外屏.以下是我在淘宝上的链接:点击打开链接.好不ea ...

  4. 使用SQL Server 2005数据库管理工具 - 初学者系列 - 学习者系列文章

    本文讲述使用SQL Server 2005 Express数据库管理工具的使用. 1.打开数据库管理工具 2.选择下面的SQL Server 身份验证,因为在安装数据库的时候设置了sa的密码. 3.选 ...

  5. px/em/pt区别和转换

    老是被人问到px.pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之.点击查看原文 这里引用的是Jorux的“95%的中国网 ...

  6. james+javamail入门

    James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于Jame ...

  7. [问题]安装express,已经加了-g,还是找不到express命令

    安装express时使用如下命令: npm install -g express 但是在命令行还是找不到express 手动将路径D:\Program Files (x86)\nodejs\node_ ...

  8. 为ASP.NET MVC应用程序创建更复杂的数据模型

    为ASP.NET MVC应用程序创建更复杂的数据模型 2014-05-07 18:27 by Bce, 282 阅读, 1 评论, 收藏, 编辑 这是微软官方教程Getting Started wit ...

  9. C++ Builder中TOpenDialog控件的使用例子

    源代码如下(opendlg_loaddata为TOpenDialog控件的name,ofAllowMultiSelect代表允许多选): opendlg_loaddata->Options &l ...

  10. 工作经常使用的SQL整理

    工作经常使用的SQL整理,实战篇(二)   工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战 ...