不同Ip 绑定同一端口 ,设置过SO_REUSEADDR选项 仍然出现address already in use 异常,求教大神指点,新人做服务器开发
不同Ip 绑定同一端口 ,设置过SO_REUSEADDR选项 仍然出现address already in use 错误,求教大神指点,新人做服务器开发
本文用四个线程绑定四个Ip到同一端口,调用过set_sock_opt();仍然有错误,只能启动第一个,后面三个错误,通过netstat命令发现此端口ip为0.0.0.0 ,通过打印信息发现我的ip确实传进去了,而且我只运行一个ip测试,绑定是成功的,服务器启动了,可以正常和客户端通讯,求教高人指点,谢谢了,新手做服务器开发。
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
using namespace std;
const char* ip_table[] = {"192.168.26.132","192.168.1.10","192.168.1.12","127.0.0.1"};
void* thread_function(void* servip)
{
struct sockaddr_in servaddr,remote;
int request_sock,nsock;
int fd_num;
int maxfd,fd;
int ret;
uint32_t addlen;
fd_set set,reset;
struct timeval timeout;
int opt = 1;
char buf[128] = {'\0'};
request_sock = socket(AF_INET,SOCK_STREAM,0);
if(request_sock < 0)
{
perror("socket");
return NULL;
}
/*enable address reuse*/
ret = setsockopt(request_sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
if(0 != ret)
{
perror("setsockopt:");
return NULL;
}
/*bind request_sock to corresponding net devicename*/
/* ret = setsockopt(request_sock,SOL_SOCKET,SO_BANDTODEVICE,"eth0:0");
if(ret)
{
printf("setsockopt SO_BANDTODEVICE failed:");
}*/
memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
printf("ip=%s\n",(char*)servip);
inet_pton(request_sock,(char*)servip,&servaddr.sin_addr.s_addr);
servaddr.sin_port = htons(20000);
ret = bind(request_sock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in));
if(ret < 0)
{
perror("bind");
return NULL;
}
ret = listen(request_sock,4);
if(ret < 0)
{
perror("listen");
return NULL;
}
FD_ZERO(&set);
FD_SET(request_sock,&set);
maxfd = request_sock;
while(1)
{
reset = set;
timeout.tv_sec = 0;
timeout.tv_usec = 1000000;
fd_num = select(maxfd+1,&reset,(fd_set*)0,(fd_set*)0,&timeout);
if(fd_num < 0)
{
perror("select");
return NULL;
}
else if(0 == fd_num)
{
printf(".");
fflush(stdout);
continue;
}
if(FD_ISSET(request_sock,&reset))
{
addlen = sizeof(struct sockaddr_in);
nsock = accept(request_sock,(struct sockaddr*)&remote,&addlen);
本文用四个线程绑定四个Ip到同一端口,调用过set_sock_opt();仍然有错误,只能启动第一个,后面三个错误,通过netstat命令发现此端口ip为0.0.0.0 ,通过打印信息发现我的ip确实传进去了,而且我只运行一个ip测试,绑定是成功的,服务器启动了,可以正常和客户端通讯,求教高人指点,谢谢了,新手做服务器开发。
#include <iostream>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
using namespace std;
#define NUM_THREADS 4
const char* ip_table[] = {"192.168.26.132","192.168.1.10","192.168.1.12","127.0.0.1"};
void* thread_function(void* servip)
{
struct sockaddr_in servaddr,remote;
int request_sock,nsock;
int fd_num;
int maxfd,fd;
int ret;
uint32_t addlen;
fd_set set,reset;
struct timeval timeout;
int opt = 1;
char buf[128] = {'\0'};
request_sock = socket(AF_INET,SOCK_STREAM,0);
if(request_sock < 0)
{
perror("socket");
return NULL;
}
/*enable address reuse*/
ret = setsockopt(request_sock,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
if(0 != ret)
{
perror("setsockopt:");
return NULL;
}
/*bind request_sock to corresponding net devicename*/
/* ret = setsockopt(request_sock,SOL_SOCKET,SO_BANDTODEVICE,"eth0:0");
if(ret)
{
printf("setsockopt SO_BANDTODEVICE failed:");
}*/
memset(&servaddr,0,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
printf("ip=%s\n",(char*)servip);
inet_pton(request_sock,(char*)servip,&servaddr.sin_addr.s_addr);
servaddr.sin_port = htons(20000);
ret = bind(request_sock,(struct sockaddr*)&servaddr,sizeof(struct sockaddr_in));
if(ret < 0)
{
perror("bind");
return NULL;
}
ret = listen(request_sock,4);
if(ret < 0)
{
perror("listen");
return NULL;
}
FD_ZERO(&set);
FD_SET(request_sock,&set);
maxfd = request_sock;
while(1)
{
reset = set;
timeout.tv_sec = 0;
timeout.tv_usec = 1000000;
fd_num = select(maxfd+1,&reset,(fd_set*)0,(fd_set*)0,&timeout);
if(fd_num < 0)
{
perror("select");
return NULL;
}
else if(0 == fd_num)
{
printf(".");
fflush(stdout);
continue;
}
if(FD_ISSET(request_sock,&reset))
{
addlen = sizeof(struct sockaddr_in);
nsock = accept(request_sock,(struct sockaddr*)&remote,&addlen);