#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<error.h>
#include<signal.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<ctype.h>
#define SERVE_PORT 8000
struct s_info
{
struct sockaddr_in clitaddr;
int connfd;
};
void * do_work(void *arg)
{
int i,n;
struct s_info *ts=(struct sockaddr*)arg;
char buf[1024];
char str[16];
while(1)
{
n=read(ts->connfd,buf,1024);
if(n==0)
{
printf("the client %d closed...\n",ts->connfd);
break;
}
printf("receive from %s at PORT %d\n",inet_ntop(AF_INET,&(*ts).clitaddr.sin_addr),str,sizeof(str),ntohs((*ts).clitaddr.sin_port));
for(int i=0;i<n;i++)
{
buf[i]=toupper(buf[i]);
}
write(STDOUT_FILENO,buf,n);
write(ts->connfd,buf,n);
}
close(ts->connfd);
return NULL;
}
int main()
{
struct sockaddr_in servaddr,clitaddr;
socklen_t clitlen;
int lfd,cfd;
pthread_t tid;
struct s_info ts[256];
int i=0;
lfd=socket(AF_INET,SOCK_STREAM,0);
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERVE_PORT);
bind(lfd,(struct servaddr *)&servaddr,sizeof(servaddr));
listen(lfd,128);
printf("Accepting client connect...\n");
while(1)
{
clitlen=sizeof(clitaddr);
cfd=accept(lfd,(struct servaddr *)&clitaddr,&clitlen);
ts[i].clitaddr=clitaddr;
ts[i].connfd=cfd;
pthread_create(&tid,NULL,do_work,(void*)&ts[i]);
pthread_detach(tid);
i++;
}
return 0;
}