socket编程之bind函数可能遇到的错误及解决办法

bind函数把一个本地地址赋予一个套接字。

#include <sys/socket.h>
int bind (int sockfd,const struct sockaddr *myaddr.socklen_t addrlen);

UNP练习代码的daytimetcpsrv1.c在运行的时候遇到了两个错误:

1.Permission denied。

这个是由于超0~1024的端口为公认端口,需要root权限运行。

2.Address already in use.

参考这篇文章的描述 IBM Developer 正在整合其语言站点组合。 – IBM Developer

bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。

所以在daytimetcpsrv1.c中加上如下代码:

int reuse = 1;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
 {
  perror("setsockopet error\n");
  return -1;
 }

重新编译运行还是会出现这个问题,代码段中我们绑定的端口号是13,通过netstat -ant 查看发现这个端口正在被使用且状态是LISTEN。

通过netstat -nltp | grep 13 我们可以发现使用端口13的进程是xinetd,系统的daytime服务。通过service xinetd stop关闭掉这个服务,再运行就可以正常运行了。

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值