gsoap:实现线程池处理时获取到客户端的ip
2013-07-24 09:30
302 查看
问题:在使用线程池处理客户端请求时发现不能获取到客户端的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.136Request accepts connection from IP 192.168.1.136Thread 3 finished serving request with failure 404Error 404 fault: SOAP-ENV:Client [no subcode]"HTTP Error: 404 Not Found"Detail: [no detail]Request accepts connection from IP 192.168.1.87Request accepts connection from IP 192.168.1.87Request accepts connection from IP 192.168.1.87
相关文章推荐
- gsoap:实现线程池处理时获取到客户端的ip
- gsoap:实现线程池处理时获取到客户端的ip
- gsoap:实现线程池处理时获取到客户端的ip
- 利用JS获取IE客户端IP及MAC的实现
- 图片、缓存-Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)-by小雨
- 利用JS获取IE客户端IP及MAC的实现
- C#通过Web获取客户端的IP与Mac地址实现
- Android仿人人客户端(v5.7.1)——对从服务器端(网络)获取的图片进行本地双缓存处理(编码实现)
- 利用JS获取IE客户端IP及MAC的实现
- 利用JS获取IE客户端IP及MAC的实现
- Java代码实现如何获取客户端的IP
- Java实现获取客户端真实IP方法小结
- [转]利用JS获取IE客户端IP及MAC的实现
- 反向代理从nginx获取客户端IP实现
- Thinkphp3.2.3框架实现自动获取客户端IP地址的get_client_ip()函数
- 在Thinkphp3.2.3框架下实现自动获取客户端IP地址的get_client_ip()函数
- Nginx获取客户端IP实现(亲测可用)
- Thinkphp3.2.3框架实现自动获取客户端IP地址的get_client_ip()函数
- 以IP来获取客户端电脑名称(一句代码实现)
- 利用JS获取IE客户端IP及MAC的实现