最近搞了个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掉。