#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#include<pthread.h>
#include<stdio.h>
#include<string.h>
#include<arpa/inet.h>
#define PORT 8848
#define BACKLOG 1000
#define MAXDATASIZE 128
#define MAXUSER 9
int select_user(char uname);
void process_cli(int connectfd,struct sockaddr_in client);
void *creat_conn(void *arg)
struct ARG
{
int connfd;
struct sockaddr_in client;
};
struct USER
{
int connfd;
char name;
}user[MAXUSER];
static int u_len=0;
int main()
{
int listenfd,connectfd;
pthread_t thread;
struct ARG *arg;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
//create tcp socket
printf("socket......");
if((listenfd=socket(AF_INET,SOCK_STREAM,O))==-1)
{
perror("creating socket failed.");
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);
printf("bind......");
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
perror("bind error.");
exit(1);
}
printf("listen......");
if(listen(listenfd,BACKLOG)==-1)
{
perror("lesten() error!");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
sleep(1);
while(1)
{
//accept() using main thread
printf("accepting......\n");
if((connectfd=accept(listenfd,(struct sockaddr *)&client,(socklen_t *)&sin_size))==-1)
{
perror("accept() error!");
exit(1);
}
printf("cread pthread arg \n");
arg=malloc(sizeof (struct ARG));
arg->connfd=connectfd;
memcpy((void *)&arg->client,&client,sizeof(client));
//invoke start_routine to handle this thread.
if(pthread_create(&thread,NULL,creat_conn,(void *)arg))
{
perror("pthread_creat() error!");
exit(1);
}
}
close(listenfd);
return 0;
}
void *creat_conn(void *arg)
{
int tid=pthread_self();
struct ARG *n_arg=arg;
process_cli(n_arg->connfd,n_arg->client);
}
void process_cli(int connectfd,struct sockaddr_in client)
{
int num,ufd,i;
int tid=pthread_self();
char recvbuf[MAXDATASIZE],sendbuf[MAXDATASIZE];
char cli_name[MAXDATASIZE];
char name;
printf("IP:%s,\n",inet_ntoa(client,sin_addr));
//get client's name from client.
user[u_len].connfd=connectfd;
user[u_len].name='a'+u_len;
printf("u_fd:%d,u_name:%c\n",user[u_len].connfd,user[u_len].name);
if(u_len++>MAXUSER)
u_len==0;
while(1)
{
memset(recvbuf,0,MAXDATASIZE);
num=recv(connectfd,recvbuf,MAXDATASIZE,0);//recv return the size.
printf("num=%d\n",num);
if(num<=0)
{
close(connectfd);
perror("Client disconnected.");
break;
}
printf("[%d]INFO:%s \n",tid,recvbuf);
//choose the user.
name=recvbuf[0];
//group send.
if(name=='x')
{
for(i=0;i<=MAXUSER;i++)
{
if(user[i].connfd>0)
{
send(user[i].connfd,recvbuf,strlen(recvbuf),0);
}
}
}
//get user's socket fd
ufd=select_user(name);
if(ufd>0)
{
send(ufd,recvbuf,strlen(recvbuf),0);
}
}
}
int select_user(char uname)
{
int i;
for(i=0;i<=MAXUSER;i++)
{
if(uname==user[i].name)
return user[i].connfd;
}
return 0;
}
评论5
最新资源