该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
源码 加其他,需要的拿去看看吧...
注:为linux环境下的,win的请绕道吧..
//简单的select()应用,网络聊天室
//服务器端..
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 256
#define PORT 8888
int main(int argc,char *argv[])
{
int fd=socket(AF_INET,SOCK_STREAM,0);
int fdclient[BUFSIZE]; //客户描述符
char buf[BUFSIZE];
int count=0;// 客户个数
fd_set fds;//监听的描述符集合
int res;//做异常处理
int maxfd=0;//最大的描述符
memset(fdclient,-1,BUFSIZE);
int index;
if(-1 == fd)
{
perror("get fd error");
exit(-1);
}
struct sockaddr_in serveraddr,clientaddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(PORT);
serveraddr.sin_addr.s_addr=inet_addr("192.168.1.103");
if(bind(fd,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr_in))==-1)
{
close(fd);
perror("bind error");
exit(-1);
}
if(listen(fd,10)==-1)
{
close(fd);
perror("listen error");
exit(-1);
}
int len=sizeof(clientaddr);
int i;
while(1)
{
FD_ZERO(&fds);
maxfd=0;
FD_SET(fd,&fds);
maxfd=maxfd>=fd?maxfd:fd;
for(i=0;i
{
if(fdclient[i]!=-1)
{
FD_SET(fdclient[i],&fds);
maxfd=maxfd>=fdclient[i]?maxfd:fdclient[i];
}
}
printf("waiting connect\n");
res=select(maxfd+1,&fds,0,0,0);
int len=sizeof(clientaddr);
if(FD_ISSET(fd,&fds))
{
int sockfd=accept(fd,(struct sockaddr*)&clientaddr,&len);
if(sockfd == -1)
{
perror("服务器崩溃");
close(fd);
exit(-1);
}
fdclient[count]=sockfd;
printf("客户链接 IP:%s:%d\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));
count++;
}
for(i=0;i
{
if(fdclient[i]!=-1 && FD_ISSET(fdclient[i],&fds))
{
res=recv(fdclient[i],buf,BUFSIZE,0);
if(res==0)
{
printf("客户端断开链接\n");
close(fdclient[i]);
fdclient[i]=-1;
}
else if(res == -1)
{
printf("网络错误\n");
close(fdclient[i]);
fdclient[i]=-1;
}
else if(res>0)
{
for(index=0;index
{
if(fdclient[index]!=-1)
send(fdclient[index],buf,res,0);
}
}
}
}
}
return 0;
}
// //
// //
// //
//客户端..
#include
#include
#include
#include
#include
#include
#include
#define PORT 8888
#define BUFSIZE 256
#define CLEAR printf("\033[2J");
#define SETPOS(x,y) printf("\033[%d;%dH",x,2*y);
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("请输入用户名在登陆\n");
exit(-1);
}
printf("%s\n",argv[1]);
int fd=socket(AF_INET,SOCK_STREAM,0);
char sendbuf[BUFSIZE];
char buf[BUFSIZE];
if(fd==-1)
{
perror("get socket fd error");
exit(-1);
}
struct sockaddr_in serveraddr;
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(PORT);
serveraddr.sin_addr.s_addr=inet_addr("192.168.1.103");
//CLEAR;
//SETPOS(10,10);
if(connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))==-1)
{
perror("connect error");
close(fd);
exit(-1);
}
printf("connect server successed,welcom:%s\n",argv[1]);
int i;
int pid=fork();
if(pid==0)
{
while(1)
{
memset(buf,*\0*,BUFSIZE);
int res=recv(fd,buf,BUFSIZE,0);
if(res>0)
{
printf("%s\n",buf);
}
}
}
while(1)
{
memset(buf,*\0*,BUFSIZE);
memset(sendbuf,*\0*,BUFSIZE);
gets(buf);
strcat(sendbuf,argv[1]);
strcat(sendbuf,":");
strcat(sendbuf,buf);
send(fd,sendbuf,BUFSIZE,0);
memset(buf,*\0*,BUFSIZE);
}
close(fd);
return 0;
}
///运行解图..
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SNyQGMxMTO1QjMjNjZ2QTOjVWN3ETMmZGZlJ2N5cjNx8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)