linux 多客户端连接服务器 《C语言》
创建 TCP server 套接字
int CreateTcpSocket(const short port)
{
int socketFd;
int opt = -1;
socketFd = socket(AF_INET,SOCK_STREAM,0);
if(socketFd == -1)
{
printf("socket error\r\n");
return -1;
}
//bind
struct sockaddr_in myaddr;
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(port);
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);//本地任意的IP地址
setsockopt(socketFd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
if(bind(socketFd,(struct sockaddr*)&myaddr,sizeof(myaddr)) == -1)
{
printf("bind error\r\n");
return -1;
}
if(listen(socketFd,10) == -1)
{
printf("listen error\r\n");
return -1;
}
return socketFd;
}
获取到最大的客户端文件描述符
int GetMaxFd(fd_set *pest)
{
int i,iMax;
for(int i = 0;i < FD_SETSIZE;i++)
{
if(FD_ISSET(i,pest))
{
iMax = i;
}
}
return iMax;
}
处理客户端数据
int ClientProcess(int sockfd)
{
unsigned char buffer[1024] = {0};
int len;
memset(buffer,0,sizeof(buffer));
if((len = recv(sockfd,&buffer,sizeof(buffer),0)) == -1)
{
printf("recv error\r\n");
return -1;
}
else if(len == 0)
{
printf("client close sockFd: \r\n",sockfd);
return -1;
}
printf("recv: %s len: %d\r\n",buffer,len);
send(sockfd,buffer,len,0);
return 0;
}
主函数:
int main()
{
int socketFd;
int socketClient,socketNew;
fd_set readset,setBak;
int len;
int iRet;
unsigned char buffer[1024] = {0};
pthread_t client_tid;
socketFd = CreateTcpSocket(12345);
FD_ZERO(&setBak);
FD_SET(socketFd,&setBak);
while(1)
{
readset = setBak;
iRet = select(GetMaxFd(&readset)+1,&readset,NULL,NULL,NULL);
if(iRet < 0)
{
printf("select error\r\n");
break;
}
if(FD_ISSET(socketFd,&readset))
{
if((socketNew = accept(socketFd,NULL,0)) == -1)
{
printf("accept error\r\n");
break;
}
FD_SET(socketNew,&setBak);
printf("new client connect: %d \r\n",socketNew);
}
for(int socketInt = 0;socketInt < FD_SETSIZE;socketInt++)
{
if(FD_ISSET(socketInt,&readset) && (socketInt != socketFd))
{
if(ClientProcess(socketInt) < 0)
{
close(socketInt);
FD_CLR(socketInt,&setBak);
}
}
}
}
close(socketFd);
return 0;
}