C语言 自己搭建的服务器和客户端 服务器在ubuntu上 客户端在开发板上
客户端连接服务器马上就被拒绝,报错 :connect server error: Connection refused
试了很多次,突然连上后
服务器一下出现了几十条 连接请求
server_line:90 nready:1
一个新的连接请求!!!
客户端代码:
//服务器IP
#define SERVER_ADDR "192.168.61.24"
//服务器端口号
#define SERVER_PORT 12000
```c
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd == -1)
{
std::perror("socket error");
return ;
}
//连接服务器
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
serverAddr.sin_port = htons(SERVER_PORT);
std::cout << "等待连接服务器..." <<std::endl;
int retcon = connect(sockfd, (struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(retcon == -1)
{
std::perror("connect server error");
return ;
}
std::cout << "连接服务器成功..." <<std::endl;
服务器代码:
//服务器IP
#define SERVER_ADDR "192.168.61.24"
//服务器端口号
#define SERVER_PORT 12000```
//建立套接字
int sockFd = socket(AF_INET,SOCK_STREAM,0);
if(sockFd == -1)
{
perror("create sockFd errror");
return NULL;
}
//设置端口复用
int optval = 1;
setsockopt(sockFd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));
//绑定服务器IP和Prot
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
serverAddr.sin_port = htons(SERVER_PORT);
bind(sockFd,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
//设置监听
listen(sockFd,10);
//初始化,存储连接上服务器的客户端 的套接字的数组
for(int i=0; i<1024; i++)
{
clientFd[i] = -1;
}
//初始化监听集合
FD_ZERO(&rset);
FD_ZERO(&allConnect);
//将监听套接字文件描述符加入监听集合
FD_SET(sockFd,&allConnect);
maxFd_c = sockFd;
//建立监听时长结构体
struct timeval timeout;
printf("套接字建立完成\n");
//使用多路复用监听,多个文件描述符的状态
while(1)
{
//保存监听集合
rset = allConnect;
timeout.tv_sec = 30;
timeout.tv_usec = 0;
//函数返回,集合中状态发生变化的文件描述符个数,同时会把状态未发生变化的文件描述符踢出集合
int nready = select(maxFd_c+1,&rset,NULL,NULL,&timeout);
if(nready == -1) //出错
{
if(EINTR == nready)//判断如果是信号干扰
{
continue;
}
perror("select error");
break;
}
else if(nready == 0) //监听超时
{
printf("select timeout\r");
continue;
}
//如果走到这里就证明集合中有文件描述符的状态发生了变化
printf("server_line:%d nready:%d\n",__LINE__,nready); //第九十行
if(FD_ISSET(sockFd,&rset))
{
printf("一个新的连接请求!!!\n");
//处理新连接上服务器的客户端
add_task(poolHead,client_connect_handle,&sockFd);
//如果监听集合中只剩一个状态发生了变化的文件描述符,则不用继续循环了
if(--nready == 0)
{
continue;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题说明你的服务器没有开启,或者服务器和客户端不在同一局域网下