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

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

#include
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.

参考这篇文章的描述 http://www.ibm.com/developerworks/cn/linux/l-sockpit/

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服务。通过server xinetd stop关闭掉这个服务,再运行就可以正常运行了。



你可能感兴趣的:(UNIX,网络编程)