请教setsockopt
main(int argc ,char **argv){
int sfd;
int port;
struct sockaddr_in in;
unsigned int optval;
int len;
sfd = socket(AF_INET, SOCK_STREAM, 0);
port = atoi(argv);
optval = 1;
Init_inet_sock(&in, "0.0.0.0", port);//对in变量进行赋值操作,
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) < 0)
printf("setsockopt err\n");
Bind(sfd, (struct sockaddr*)&in, sizeof (in));
if (listen(sfd, 10) == -1) {
if (errno == EADDRINUSE)
printf ("EADDRINUSE\n");
else
printf ("listen err:%s(%d)\n", strerror(errno), errno);
}else {
printf ("listen right\n");
}
}
对一个已经使用的port进行绑定,为什么还会出现绑定错误(Address already in use (errno:98)) 返回错误说的很明显了吧! 你用netstat -tunl看看,是否冲突了. main(int argc ,char **argv)
{
int sfd;
int port;
struct sockaddr_in in;
int optval, val = 0;
int len;
sfd = socket(AF_INET, SOCK_STREAM, 0);
port = atoi(argv);
optval = 1;
Init_inet_sock(&in, "0.0.0.0", port);
if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
printf("setsockopt err\n");
getsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &val, &len);
printf("val=%d,len=%d\n", val, len);
Bind(sfd, (struct sockaddr*)&in, sizeof (in));
if (listen(sfd, 10) == -1) {
if (errno == EADDRINUSE)
printf ("EADDRINUSE\n");
else
printf ("listen err:%s(%d)\n", strerror(errno), errno);
}else {
printf ("listen right\n");
}
}输出:
val=0,len=0
bind socket error :Address already in use (errno:98)
setsockopt好像没设置成功,为什么
回复 2# wangell2012
你换一个端口试试先, SO_REUSEADDR这个属性并不是你想象的那样,你可以上网再搜一下. SO_REUSEADDR可以重用与某个端口关联的地址,通常是进程挂了,但对应的TCP状态还在内核维护,重启进程可以使用原有端口。而不是重用已经在用的端口,任何选项都做不到,想想也不可能嘛!否则TCP端到端怎么实现? 从网上找的一句话感觉很有用:
一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。
SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,才可以重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。TCP,先调用close()的一方会进入TIME_WAIT状态
页:
[1]