socket bind error记录

最近搞了个web服务器,调试的时候出现了一些状况记录一下。

bind绑定失败,权限不够

  • bind需要root权限。

用Visual Studio通过SSH连接ubuntu调试程序,使用SSH不能用root登陆。

解决办法是:

  • vi /etc/ssh/sshd_config
  • 找到PermitRootLogin prohibit-password,这一行是注释的。添加一行PermitRootLogin yes。
  • 重启服务:sudo service ssh restart。

服务器执行的时候,使用ctrl_z,再起服务器的时候会出现 bind error : Address already in use。

  • 一开始我觉得很奇怪,我已经设置了端口复用,setsockopt( listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval) ) == -1 ),但是还是报错。我绑定的端口为80。
  • 查看tcp用作监听端口的使用情况,netstat -lnp | grep tcp
    • l:listening,Show only listening sockets.
    • n:numeric, 让端口表示为数字,不加的话,像80端口会被表示为http。
    • p:表示进程ID和进程名,PID/Program name。
      在这里插入图片描述
      可以发现没有显示线程名和Program name。这里需要使用root权限就能显示了。
      在这里插入图片描述
      可以看出80端口被我们的WebServer占用了,Ctrl-Z并没有关闭程序。
  • ps ajw看一下进程
  • 在这里插入图片描述
    STATE列服务器进程状态为TL,看一下Tl代表什么,调用man ps,查找STATE关键字:
  • T:stopped by job control signal。
  • l: is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
    看一个Ctrl z 和 Ctrl C的区别:
  • Ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态。
  • Ctrl+c是强制中断程序的执行。
    所以可见当我不熟悉Ctrl+z的时候,我主观想要关闭程序,但是却被挂起了,导致80端口没有被释放,导致我再次起程序的时候显示地址被占用的错误,解决办法就是把这个挂起的服务器进程kill掉。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值