#include?<stdio.h>
#include?<strings.h>
#include?<unistd.h>
#include?<sys/types.h>
#include?<sys/socket.h>
#include?<netinet/in.h>
#include?<arpa/inet.h>
#include?<sys/time.h>
#include?<stdlib.h>
#include?<string.h>
#define?PORT?1234
#define?BACKLOG?5
#define?MAXDATASIZE?1000
typedef?struct?CLIENT{
int?fd;
char?*name;
struct?sockaddr_in?addr;
char?*data;
};
void?process_cli(CLIENT?*client,char?*recvbuf,int?len);
void?savedata(char?*recvbuf,int?len,char?*data);
int?main(){
int?i,maxi,maxfd,sockfd;
????????CLIENT?client[FD_SETSIZE];
int?nready;
ssize_t?n;
fd_setrset,allset;
int?listenfd,connectfd;
struct?sockaddr_in?server;
char?recvbuf[MAXDATASIZE];
int?sin_size;
??????
if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("Creating?socket?falied.");
exit(1);
}
int?opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(struct?sockaddr?*)&server,sizeof(struct?sockaddr))==1){
perror("Bind?error.");
exit(1);
}
if(listen(listenfd,BACKLOG)==-1){
perror("listen()?error.\n");
exit(1);
}
sin_size=sizeof(struct?sockaddr_in);
maxfd=listenfd;
maxi=-1;
for(i=0;i<FD_SETSIZE;i++){
client[i].fd=-1;
}
FD_ZERO(&allset);
FD_SET(listenfd,&allset);
while(1){
struct?sockaddr_in?addr;
rset=allset;
nready=select(maxfd+1,&rset,NULL,NULL,NULL);
if(FD_ISSET(listenfd,&rset)){
if((connectfd=accept(listenfd,(struct?sockaddr?*)&addr,&sin_size))==-1){
perror("accept()?error\n");
continue;
}
for(i=0;i<FD_SETSIZE;i++)
if(client[i].fd<0){
client[i].fd=connectfd;
client[i].name=new?char[MAXDATASIZE];
????????????????????????????????????????//client[i].name=(char?*)malloc(MAXDATASIZE);
????????????????????????????????????????//stu[i].name=(char?*)malloc(MAXDATASIZE);
client[i].addr=addr;
client[i].data=new?char[MAXDATASIZE];
????????????????????????????????????????//stu[i].snum=(char?*)malloc(MAXDATASIZE);
client[i].name[0]='\0';
client[i].data[0]='\0';
????????????????????????????????????????//stu[i].name[0]='\0';
????????????????????????????????????????//stu[i].snum[0]='\0';
printf("You?got?a?connection?from?%s.",inet_ntoa(client[i].addr.sin_addr));
break;
}
if(i==FD_SETSIZE)
printf("too?many?clients\n");
FD_SET(connectfd,&allset);
if(connectfd>maxfd)
maxfd=connectfd;
if(i>maxi)
maxi=i;
if(--nready<=0)
continue;
}
for(i=0;i<=maxi;i++){
if((sockfd=client[i].fd)<0))
continue;
if(FD_ISSET(sockfd,&rset)){
if((n=recv(sockfd,recvbuf,MAXDATASIZE,0))==0){
close(sockfd);
printf("Client(%s)?closed?connection.User's?data:%s\n",client[i].name,client[i].data);
FD_CLR(sockfd,&allset);
client[i].fd=-1;
???????????????????????????????????????//?free(stu[i].name);
????????????????????????????????????????//free(stu[i].data);
free(client[i].name);
free(client[i].data);
}else
process_cli(&client[i],recvbuf,n);
if(--nready<=0)
break;
}
}
}
close(listenfd);
}
void?process_cli(CLIENT?*client,char?*recvbuf,int?len){
char?sendbuf[MAXDATASIZE];
recvbuf[len-1]='\0';
if(strlen(client->name)==0){
memcpy(client->name,recvbuf,len);
printf("Client's?name?is:%s.\n",client->name);
return;
}
printf("Received?client(%s)?message:%s\n",client->name,recvbuf);
savedata(recvbuf,len,client->data);
for(int?i1=0;i1<len-1;i1++){
sendbuf[i1]=recvbuf[len-i1-2];
}
sendbuf[len-1]='\0';
send(client->fd,sendbuf,strlen(sendbuf),0);
}
void?savedata(char?*recvbuf,int?len,char?*data){
int?start=strlen(data);
for(int?i=0;i<len;i++){
data[start+i]=recvbuf[i];
}
}
- 1 回答
- 0 關注
- 1097 瀏覽
添加回答
舉報
0/150
提交
取消