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.
参考这篇文章的描述 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服务。通过service xinetd stop关闭掉这个服务,再运行就可以正常运行了。