《UNIX网络编程(卷1):套接字联网API(第3版)》

ngx_connection.c

ngx_int_t
ngx_open_listening_sockets(ngx_cycle_t *cycle)
{int               reuseaddr;ngx_uint_t        i, tries, failed;ngx_err_t         err;ngx_log_t        *log;ngx_socket_t      s;ngx_listening_t  *ls;reuseaddr = 1;
#if (NGX_SUPPRESS_WARN)failed = 0;
#endiflog = cycle->log;/* TODO: configurable try number */for (tries = 5; tries; tries--) {failed = 0;/* for each listening socket */ls = cycle->listening.elts;for (i = 0; i < cycle->listening.nelts; i++) {if (ls[i].ignore) {continue;}if (ls[i].fd != -1) {continue;}if (ls[i].inherited) {/* TODO: close on exit *//* TODO: nonblocking *//* TODO: deferred accept */continue;}s = ngx_socket(ls[i].sockaddr->sa_family, ls[i].type, 0);if (s == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_socket_n " %V failed", &ls[i].addr_text);return NGX_ERROR;}if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,(const void *) &reuseaddr, sizeof(int))== -1){ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,"setsockopt(SO_REUSEADDR) %V failed",&ls[i].addr_text);if (ngx_close_socket(s) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_close_socket_n " %V failed",&ls[i].addr_text);}return NGX_ERROR;}#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)if (ls[i].sockaddr->sa_family == AF_INET6) {int  ipv6only;ipv6only = ls[i].ipv6only;if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,(const void *) &ipv6only, sizeof(int))== -1){ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,"setsockopt(IPV6_V6ONLY) %V failed, ignored",&ls[i].addr_text);}}
#endif/* TODO: close on exit */if (!(ngx_event_flags & NGX_USE_AIO_EVENT)) {if (ngx_nonblocking(s) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_nonblocking_n " %V failed",&ls[i].addr_text);if (ngx_close_socket(s) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_close_socket_n " %V failed",&ls[i].addr_text);}return NGX_ERROR;}}ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,"bind() %V #%d ", &ls[i].addr_text, s);if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {err = ngx_socket_errno;if (err == NGX_EADDRINUSE && ngx_test_config) {continue;}ngx_log_error(NGX_LOG_EMERG, log, err,"bind() to %V failed", &ls[i].addr_text);if (ngx_close_socket(s) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_close_socket_n " %V failed",&ls[i].addr_text);}if (err != NGX_EADDRINUSE) {return NGX_ERROR;}failed = 1;continue;}#if (NGX_HAVE_UNIX_DOMAIN)if (ls[i].sockaddr->sa_family == AF_UNIX) {mode_t   mode;u_char  *name;name = ls[i].addr_text.data + sizeof("unix:") - 1;mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);if (chmod((char *) name, mode) == -1) {ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,"chmod() \"%s\" failed", name);}if (ngx_test_config) {if (ngx_delete_file(name) == NGX_FILE_ERROR) {ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,ngx_delete_file_n " %s failed", name);}}}
#endifif (listen(s, ls[i].backlog) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,"listen() to %V, backlog %d failed",&ls[i].addr_text, ls[i].backlog);if (ngx_close_socket(s) == -1) {ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,ngx_close_socket_n " %V failed",&ls[i].addr_text);}return NGX_ERROR;}ls[i].listen = 1;ls[i].fd = s;}if (!failed) {break;}/* TODO: delay configurable */ngx_log_error(NGX_LOG_NOTICE, log, 0,"try again to bind() after 500ms");ngx_msleep(500);}if (failed) {ngx_log_error(NGX_LOG_EMERG, log, 0, "still could not bind()");return NGX_ERROR;}return NGX_OK;
}

调试结果:

注意:查看是bind的第二个参数指向特定协议的地址结构的指针是p  *(struct sockaddr_in *)(ls[0].sockaddr)   而不是p  *(struct sockaddr *)(ls[0].sockaddr)

故意将默认端口改为801看看:

(gdb) p *(struct sockaddr_in *)(ls[i].sockaddr)
$3 = {sin_family = 2, sin_port = 8451, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}
(gdb) p    htons(80)
$4 = 20480
(gdb) p htons(801)
$5 = 8451

从Nginx绑定80端口学套接字编程相关推荐

  1. JAVA网络编程→BIO到NIO、IP域名服务器DNS端口、套接字编程Socket、TCP与UDP

    视之不见名曰夷:听之不闻名曰希:搏之不得名曰微. 此三者不可致诘,故混而为一. 其上不皦,其下不昧,绳绳兮不可名,复归于无物. 是谓无状之状,无物之象,是谓惚恍. 迎之不见其首:随之不见其后. 执古之 ...

  2. 【记录一次nginx转发 80端口无效】

    提示:记录一次nginx转发 80端口无效 文章目录 一.记录一次nginx转发 80端口无效 手动分割线 一.记录一次nginx转发 80端口无效 在自己的服务器上玩nginx,想直接访问域名调到我 ...

  3. mac下安装JAVA开发工具(6)------tomcat、IDEA及nginx转发80端口到8080

    IDEA Tomcat 及Nginx的协作开发 在mac下开发java 少不了使用tomcat macos系统下的80端口是root权限才能使用 因此使用IDEA启动tomcat80端口时总会出现问题 ...

  4. Mac OS绑定80端口

    2019独角兽企业重金招聘Python工程师标准>>> Mac OS绑定80端口 有些项目在本地测试时,必须以域名方式访问,可以修改hosts文件的域名映射,但在MacOS中是不可以 ...

  5. 解决启动nginx时报80端口被占用的问题

    解决启动nginx时报80端口被占用的问题 参考文章: (1)解决启动nginx时报80端口被占用的问题 (2)https://www.cnblogs.com/qianzf/p/6812359.htm ...

  6. nginx使用80端口

    nginx使用80端口 解决办法 nginx的默认端口是80 http协议默认80,可以省略不写 当我想在nginx.conf配置80端口时,发现打开的还是nginx欢迎页 server {liste ...

  7. 【计算机网络】Internet原理与技术3 — 端口及套接字、用户数据报协议UDP、传输控制协议TCP

    Internet原理与技术 一.端口及套接字 1.传输层编址 2.套接字(socket) 3.无连接服务和面向连接服务 二.用户数据报协议UDP UDP协议格式 [例]校验UDP报文 UDP小结 三. ...

  8. linux udp套接字编程获取报文源地址和源端口(二)

    之前项目中涉及udp套接字编程,其中一个要求是获取客户端发过来报文的端口和ip地址,功能很简单,只是对这一块不很熟.之前使用的方法是通过调用recvmsg这个接口,并通过参数msg里面的msg_nam ...

  9. 网络编程之端口与套接字

    网络编程之端口与套接字 写给将来的自己看,对于其他人不敢保证可读性. 端口 概念与用途 端口是TCP/IP协议簇中,应用层进程与传输层协议实体间的通信接口. 应用层进程通过系统调用与某个端口进行绑定, ...

最新文章

  1. shell --- trap 抓取信号
  2. 深入理解C++中的mutable关键字 ​
  3. Spring Boot中实现跨域的五种方式
  4. 计组(唐朔飞)第一章自我总结
  5. python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)
  6. 深入了解RabbitMQ工作原理及简单使用
  7. 有了这些,文件批量重命名还需要求助其它工具吗?
  8. [原创]MYSQL周期备份shell脚本
  9. 拓端tecdat|R语言MCMC的rstan贝叶斯回归模型和标准线性回归模型比较
  10. mq消息落地及业务处理踩坑记录
  11. oracle库导出命令,Oracle数据库导出、导入命令
  12. 白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)...
  13. 微信小程序 集成腾讯云IM做的聊天室
  14. 什么叫结构化程序设计?它的主要内容是什么
  15. CYGWIN安装方法
  16. Python零基础学习笔记(三十三)—— 窗体的控制
  17. 区分当前用户SIM卡是移动还是联通
  18. Onlyoffice不打开文档的情况下下载正在编辑的文档
  19. 下属被阿里挖角的那个早晨,我开始想念周鸿祎!
  20. 浙大计算机学硕初试分数线,2016年浙江大学计算机考研复试分数线_浙江大学考研分数线...

热门文章

  1. PCA(3):PCA实现C++代码
  2. Window10 VS17下 Opencv3.4.5配置
  3. 力扣(LeetCode)刷题,简单+中等题(第35期)
  4. laravel carbon 格式化日期_Laravel 编码实践分享
  5. VS2015不显示工程文本信息
  6. There's no Qt version assigned to this project for platform Win32/Win64
  7. 【汇总】细数VSCode中那些能够真正意义提升开发效率、鲜为人知的快捷键
  8. 设置VSCode快速切换多个项目窗口的快捷键Alt+E
  9. 舒工深度解析不规则场地座位二维码生成规则
  10. CentOS 7.7 x86-64安装系统字体及美化实录