#include <myhead.h>
int main(int argc, const char *argv[])
{
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1){
printf("socket error\n");
return -1;
}
int re=1;
if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&re,sizeof(re))==-1){
perror("setsockopt error");
return -1;
}
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(8888);
sin.sin_addr.s_addr=inet_addr("192.168.117.74");
if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){
perror("bind error");
return -1;
}
if(listen(sfd,128)==-1){
perror("listen error");
return -1;
}
printf("888\n");
struct sockaddr_in cin;
socklen_t socklen=sizeof(cin);
fd_set one,two;
FD_ZERO(&one);
FD_ZERO(&two);
FD_SET(0,&one);
FD_SET(sfd,&one);
int nfd;
int maxfd=sfd;
char ch[128]="";
struct sockaddr_in cin_arr[1024];
while(1){
two=one;
printf("111\n");
sleep(1);
int res=select(maxfd+1,&two,NULL,NULL,NULL);
printf("res=%d\n",res);
if(res==-1){
perror("select error");
return -1;
}else if(res==0){
perror("timeout");
return -1;
}
for(int i=0;i<=maxfd;i++){
if(!FD_ISSET(i,&two)){
continue;
}
if(i==sfd){
nfd=accept(sfd,(struct sockaddr*)&sin,&socklen);
if(nfd==-1){
perror("accept error");
return -1;
}
printf("[%s]:[%d]已上线!!!\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));
cin_arr[nfd]=cin;
FD_SET(nfd,&one);
if(nfd>maxfd){
maxfd=nfd;
}
}else if(0==i){
fgets(ch,sizeof(ch),stdin);
ch[strlen(ch)-1]=0;
printf("键盘输入了:%s\n",ch);
for(int i=4;i<=maxfd;i++){
send(i,ch,strlen(ch),0);
}
printf("发送成功!!!\n");
}else{
char ch1[128]="";
bzero(ch,sizeof(ch));
int res=recv(i,ch1,sizeof(ch1),0);
if(res==0){
printf("下线了!!!\n");
close(i);
FD_CLR(i,&one);
for(int i=maxfd;i>=0;i--){
if(FD_ISSET(i,&one)){
maxfd=i;
break;
}
}
continue;
}
printf("666\n");
send(i,ch1,sizeof(ch1),0);
printf("发送成功\n");
}
}
}
close(sfd);
return 0;
}
03-19