nginx模块编程之获取客户ip及端口号
ngx_request_t结构体中有一个connection定义,该定义指向一个ngx_connection_t的结构体:
结构体定义如下:
struct ngx_connection_s {
void *data;
ngx_event_t *read;
ngx_event_t *write;
ngx_socket_t fd;
ngx_recv_pt recv;
ngx_send_pt send;
ngx_recv_chain_pt recv_chain;
ngx_send_chain_pt send_chain;
ngx_listening_t *listening;
off_t sent;
ngx_log_t *log;
ngx_pool_t *pool;
struct sockaddr *sockaddr;
socklen_t socklen;
ngx_str_t addr_text;
ngx_str_t proxy_protocol_addr;
#if (NGX_SSL)
ngx_ssl_connection_t *ssl;
#endif
struct sockaddr *local_sockaddr;
socklen_t local_socklen;
ngx_buf_t *buffer;
ngx_queue_t queue;
ngx_atomic_uint_t number;
ngx_uint_t requests;
unsigned buffered:;
unsigned log_error:; /* ngx_connection_log_error_e */
unsigned unexpected_eof:;
unsigned timedout:;
unsigned error:;
unsigned destroyed:;
unsigned idle:;
unsigned reusable:;
unsigned close:;
unsigned sendfile:;
unsigned sndlowat:;
unsigned tcp_nodelay:; /* ngx_connection_tcp_nodelay_e */
unsigned tcp_nopush:; /* ngx_connection_tcp_nopush_e */
unsigned need_last_buf:;
#if (NGX_HAVE_IOCP)
unsigned accept_context_updated:;
#endif
#if (NGX_HAVE_AIO_SENDFILE)
unsigned busy_count:;
#endif
#if (NGX_THREADS)
ngx_thread_task_t *sendfile_task;
#endif
};
结构体中,有两个sockaddr地址结构定义,分别是sockaddr以及local_sockaddr;前者为客户端地址,后者为服务器端地址;下面来看sockaddr的定义:
struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[]; /* 14 bytes of protocol address */
};
sa_data是协议地址,由sa_family决定。如果sa_family=AF_INET,则sa_data就是sockaddr_in的
sin_addr和sin_port,用于为套接口储存目标地址和端口信息。为了解决struct
sockaddr赋值以及访问,提供了了一个并列的结构struct sockadd_in(“in”代表
“Internet”),换句话说,sockaddr的数据存储大小和结构完全和sockaddr_in一致,可以直接强制转换。
struct sockaddr_in{
short int sin_family; /*地址族信息,通常是AF-xxxx的形式*/
unsigned short int sin_port; /*端口信息*/
struct in_addr sin_addr; /*网络地址*/
unsigned char sin_zero[]; /*补位用的0,to make same size as struct sockaddr*/
}
关于这两个结构体,他们占用的内存大小是一样的,当sockaddr_in.sin_family = AF_INET时,他们的内存布局也一样的!看看sockaddr结构体自身就知道了,它仅仅是个char数组,大小与sockaddr_in等同。
这两个结构体使用转化的例子如下:
- sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数
/*sockaddr_in强制转化为sockaddr,用于传入系统调用函数*/
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, ); my_addr.sin_family = AF_INET; /* 主机字节序 */
my_addr.sin_port = htons(MYPORT); /* short, 网络字节序 */ my_addr.sin_addr.s_addr = inet_addr("192.168.0.1"); bzero(&(my_addr.sin_zero), ); /* zero the rest of the struct */
//memset(&my_addr.sin_zero, 0, 8); bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));//将sockaddr_in强制转化为sockaddr,用于传入系统调用函数
- sockaddr结构强制转换成sockaddr_in结构,从而得到ip地址和端口号
struct sockaddr_in *ip = (struct sockaddr_in *) (r->connection->sockaddr);
char* addr = inet_ntoa(ip->sin_addr);//地址转化函数,返回字符串指针
unsigned short port = ntohs(ip->sin_port);//大小端转换
nginx模块编程之获取客户ip及端口号的更多相关文章
- jsp 获取服务器ip 以及端口号
<a href=<%="http://"+request.getLocalAddr()+":"+request.getLocalPort()+&qu ...
- 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- 关于.net core使用nginx做反向代理获取客户端ip的问题
1.正常情况下.net core获取客户端ip是比较简单的 /// <summary> /// 获取客户Ip /// </summary> /// <param name ...
- 从HTTP请求中获取客户IP地址
/** * 从HTTP请求中获取客户IP地址 * * @param request http请求 * @return 客户IP地址 */ public s ...
- 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装
系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...
- tcp协议 tcpip协议 http协议,IP,DNS,端口号
每当看到HTTP协议,tcp/ip协议,TCP协议总是蒙圈:在这里先记录一下,方面自己查看 TCP协议:TCP(Transmission Control Protocol 传输控制协议)是一种面向连接 ...
- java正则表达式提取地址中的ip和端口号
由于我需要用到java正则表达式提取地址中的ip和端口号,所以我就写了一个demo,测试一下,下面是demo public class Test0810_1 { public static void ...
- IIS网站建立好后如何更改绑定IP或端口号
写在前面的话 我们利用IIS建立网站的时候,一般都是设定好网站名称和物理地址,直接下一步建立完成了.正常访问都没问题,但如果我们这时候想要更改访问的IP或者端口号,打开了很多设置项就是没找到设置的地方 ...
随机推荐
- 再硬写一个最简单的HTTPSERVER
参考同上一个贴: 纯于练手. #HTTPserver import socket HOST = '' PORT = 8088 text_content = '''HTTP/1.x 200 OK Con ...
- POJ - 2711 Leapin' Lizards
题目大意: 在一个网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一 ...
- Android开发之ADT中无Annotation Processin的解决办法
使用ButterKnife的时候,进入ADT中设置的时候发现在Java Compiler展开后无Annotation Processin 解决办法: 安装插件:Juno - http://downlo ...
- 结构体dict_index_t;
/** InnoDB B-tree index */ typedef struct dict_index_struct dict_index_t; /** Data structure for an ...
- 屯题50AC纪念
从2.1起开始屯题,一直弄到现在才完成了一发50题的目标,实在太弱 (当然之间事比较多,还是挺不容易的) 不过总算是完成了一个小的目标了 接下来两周要进行小高考最后冲刺了,所以我大概不会再怎么刷题了 ...
- Java之 AtomicInteger
AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicIn ...
- python __enter__ 与 __exit__的作用,以及与 with 语句的关系
转载自:http://linbo.github.io/2013/01/08/python-with/ (一直不知道博客园哪里发转载文章) With语句是什么? 有一些任务,可能事先需要设置,事后做清理 ...
- Linux入门1
在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. Li ...
- 【CSS3】Advanced7:CSS Transitions
1.animate parts of your design without the need for the likes of JavaScrip 2.allowing smooth animati ...
- Java笔记(四)……常量与变量
常量 常量表示不会改变的数值. Java中常量的分类: 整数常量:所有整数 小数常量:所有小数 布尔型常量:较为特有,只有两个数值,true false 字符常量:将一个数字字母或者符号用单引号(' ...