server.c
#include<errno.h>
#include<semaphore.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<signal.h>
#include<pthread.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/select.h>
#include<sys/poll.h>
#include "wrap.h"
#define SERVER_PORT 8000
#define MAXLINE 4096
#define OPEN_MAX 1200
int main(int argc,char* argv[]){
int nready,i,maxi,listenfd,connfd,sockfd;
char ans[]="I get it!\n";
char bns[]="One has gone!\n";
ssize_t n;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
socklen_t cliaddr_len;
struct sockaddr_in cliaddr,servaddr;
struct pollfd client[OPEN_MAX];
listenfd=Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERVER_PORT);
Bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
Listen(listenfd,20);
client[0].fd=listenfd;
client[0].events=POLLRDNORM;
maxi=0;
for(i=1;i<FD_SETSIZE;i++)client[i].fd=-1;
while(1){
nready=poll(client,maxi+1,-1);
if(nready<0)perr_exit("select error");
if(client[0].revents&POLLRDNORM){
cliaddr_len=sizeof(cliaddr);
connfd=Accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddr_len);
printf("received from %s at PROT %d\n",
inet_ntop(AF_INET,&cliaddr.sin_addr,str,sizeof(str)),
ntohs(&cliaddr.sin_port));
for(i=1;i<OPEN_MAX;i++){
if(client[i].fd<0){
client[i].fd=connfd;
client[i].events=POLLRDNORM;
break;
}
}
if(i==OPEN_MAX){
fputs("too many clients\n",stderr);
exit(1);
}
if(i>maxi)maxi=i;
if(--nready==0)continue;
}
for(i=1;i<=maxi;i++){
if((sockfd=client[i].fd)<0)continue;
if(client[i].revents&(POLLRDNORM|POLLERR)){
if((n=Read(sockfd,buf,MAXLINE))<0){
if(errno==ECONNRESET){
Write(STDOUT_FILENO,bns,sizeof(bns));
Close(sockfd);
client[i].fd=-1;
}
else perr_exit("read error");
}
else if(n==0){
Write(STDOUT_FILENO,bns,sizeof(bns));
Close(sockfd);
client[i].fd=-1;
}
else {
int j;
for(j=0;j<n;j++)buf[j]=toupper(buf[j]);
Write(STDOUT_FILENO,buf,n);
Write(sockfd,ans,sizeof(ans));
}
if(--nready==0)break;
}
}
}
close(listenfd);
return 0;
}
client.c
#include<errno.h>
#include<semaphore.h>
#include<string.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<signal.h>
#include<pthread.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define SERVER_PORT 8000
#define MAXLINE 4096
int main(){
struct sockaddr_in serveraddr;
int confd,len;
char ipstr[]="192.168.133.129";
char buf[MAXLINE];
confd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
inet_pton(AF_INET,ipstr,&serveraddr.sin_addr.s_addr);
serveraddr.sin_port=htons(SERVER_PORT);
connect(confd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
while(fgets(buf,sizeof(buf),stdin)){
write(confd,buf,strlen(buf));
len=read(confd,buf,sizeof(buf));
write(STDOUT_FILENO,buf,len);
}
close(confd);
return 0;
}