?? chatserv.c
字號:
/*
Chatroom server using select
Copyright (C) 2004-2006, Li Suke, School of Software and Microelectronics,
Peking University
This is free software; you can redistribute it and/or
modify it freely.
This software is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/select.h>
#include <string.h>
#include <errno.h>
#define BACK_LOG 10
#define BUF_SIZE 1024
int main(int argc, char *argv[]){
int sockfd;
int connfd;
int clifd;
int clifd2;
struct sockaddr_in servaddr,cliaddr;
int clilen;
int port;
int client[FD_SETSIZE];
fd_set allset,rdset;
int max_fd;
int i;
int nready;
int max_index;
char buffer[BUF_SIZE];
int j;
int len;
if(argc != 2){
printf("Usage chatsrv port\n");
exit(0);
}
port = atoi(argv[1]);
bzero(&servaddr,sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(port);
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket");
exit(1);
}
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(struct sockaddr))==-1){
perror("bind");
exit(1);
}
if(listen(sockfd,BACK_LOG)==-1){
perror("listen");
exit(1);
}
max_fd = sockfd;
FD_ZERO(&allset);
FD_ZERO(&rdset);
FD_SET(sockfd,&allset);
for(i=0;i< FD_SETSIZE;i++)
client[i] = -1;
max_index = -1;
for(;;){
rdset = allset;
nready = select(max_fd+1,&rdset,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&rdset)){
clilen = sizeof(cliaddr);
connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&clilen);
if(connfd ==-1){
perror("accept");
continue;
}
for(i=0;i<FD_SETSIZE;i++){
if(client[i]==-1){
client[i] = connfd;
break;
}
}
if(i==FD_SETSIZE){
printf("Too many client here!\n");
exit(1);
}
if(i > max_index)
max_index = i;
if(connfd > max_fd)
max_fd = connfd;
FD_SET(connfd,&allset);
if(--nready <=0)
continue;
}
for (i=0;i<=max_index;i++){
if((clifd=client[i])< 0)
continue;
if(FD_ISSET(clifd,&rdset)){
len = BUF_SIZE;
if((len = recv(clifd,buffer,len,0))<=0){
close(clifd);
FD_CLR(clifd,&allset);
client[i] = -1;
}else{
printf("buffer is %s",buffer);
for(j=0;j<=max_index;j++){
clifd2 = client[j];
if(clifd2>0 && clifd2!=sockfd)
send(clifd2,buffer,len,0);
} //for
if(--nready <=0)
break;
}//else
}//if
}//for
}//for
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -