问题:

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

原因:

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

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

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

    修改 enqueue函数
  1. int enqueue(SOAP_SOCKET sock,unsigned long ip)//添加ip的参数
  2. {
  3. int status = SOAP_OK;
  4. int next;
  5. int ret;
  6. if ((ret = MUTEX_LOCK(queue_cs)))
  7. fprintf(stderr, "MUTEX_LOCK error %d\n", ret);
  8. next = (tail + 1) % MAX_QUEUE; //1000
  9. if (head == next)
  10. {
  11. /* don't block on full queue,
  12. * 队列已满,return SOAP_EOM */
  13. status = SOAP_EOM;
  14. }
  15. else
  16. {
  17. queue[tail] = sock;
  18. ips[tail] = ip; //保存ip
  19. tail = next;
  20. if ((ret = COND_SIGNAL(queue_cv)))
  21. fprintf(stderr, "COND_SIGNAL error %d\n", ret);
  22. }
  23. if ((ret = MUTEX_UNLOCK(queue_cs)))
  24. fprintf(stderr, "MUTEX_UNLOCK error %d\n", ret);
  25. return status;
  26. }

    添加dequeue_ip()函数
  1. unsigned long dequeue_ip()
  2. {
  3. unsigned long ip;
  4. int num=0;
  5. if(head == 0)
  6. num = MAX_QUEUE - 1;
  7. else
  8. num = head -1;
  9. ip = ips[num];
  10. return ip;
  11. }


修改queue回调函数函数
  1. void *process_queue(void *soap)
  2. {
  3. struct soap *tsoap = (struct soap*)soap;
  4. for (;;)
  5. {
  6. tsoap->socket = dequeue();
  7. tsoap->ip = dequeue_ip();//获取相应的ip地址
  8. if (!soap_valid_socket(tsoap->socket))
  9. {
  10. #ifdef DEBUG
  11. fprintf(stderr, "Thread %d terminating\n", (int)(long)tsoap->user);
  12. #endif
  13. break;
  14. }

解决!

测试:
在http_get_handler函数中测试
  1.  
  1. int http_get_handler(struct soap *soap)

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

输出:
  1. Request accepts connection from IP 192.168.1.136
  2. Request accepts connection from IP 192.168.1.136
  3. Thread 3 finished serving request with failure 404
  4. Error 404 fault: SOAP-ENV:Client [no subcode]
  5. "HTTP Error: 404 Not Found"
  6. Detail: [no detail]
  7. Request accepts connection from IP 192.168.1.87
  8. Request accepts connection from IP 192.168.1.87
  9. 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. C# 之 托付

    托付(delegate)     托付是一种能够把引用存储为函数的类型.托付也能够看成是一种数据类型,能够用于定义变量,但它是一种特殊的数据类型,它所定义的变量能接受的数值仅仅能是一个函数,更确切的说 ...

  2. C语言 链表

    原文:C语言 链表 最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能. ...

  3. 74LS183 加法器 【数字电路】

    74LS183 搭的一个还有点意思的加法电路,串行进位的 2+6 == 8 大家都懂的哈哈

  4. WimMaker 2.0 (2013.10) WIM制作工具

    WimMaker 2.0 (2013.10) WIM制作工具 可用于制作PE启动内核的Wim文件 说明: 因本软件使用.NET2.0制作,故主要用于制作WIM映像不用于备份还原系统(虽可用,但不专业, ...

  5. PHP 4:从Login进一步看到的

    原文:PHP 4:从Login进一步看到的 我们已经在PHP 3:从Login界面谈PHP标记谈到了PHP标记,不过其页面代码有一句 require_once('bookmark_fns.php'); ...

  6. PHP中遍历stdclass object 及 json

    原文:PHP中遍历stdclass object 及 json (从网上找的模拟实例)需要操作的数据: $test=Array ( [0] => stdClass Object ( [tags] ...

  7. mysql编码的那点事

    Mysql编码问题  在php页面可以向mysql插入英文字符,但就是不能插入中文字符,在cmd客户端也可从插入,这是困扰我两天的问题. 在网上找了很多资料,最终确定了是字符编码这个地方出现了问题,首 ...

  8. javascript 动态创建tip图片提示

    前言: 在做前端的项目中,经常看到移动一个小图标上显示这个图标对应的大图的提示,之前的做法是在小图标的位置后面添加一个div,然后移动到小图标然后显示这个图标的图片!但是这个方法做的时候发现,如果提示 ...

  9. awk精简教材

    awk就不多介绍了,最优秀的文本处理工具之一 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入字段分隔符 默认是空格 NF 当 ...

  10. 《C语言 学生成绩管理系统》

    /* (盯着先拔头筹程序) * 该计划的版权声明和版本号 * Copyright (c) 2011, 烟台大学计算机学院学生的学校 * All rights reserved. * 文件名: 学生成绩 ...