socket聊天室—多线程服务器模型
服务器端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#define RECVBUFSIZE 2048
void *rec_func(void *arg)
{
int sockfd,new_fd,nbytes;
char buffer[RECVBUFSIZE];
int i;
new_fd = *((int*)arg);
free(arg);
while(1)
{
if((nbytes=recv(new_fd,buffer,RECVBUFSIZE,0))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
if(nbytes ==-1)
{
close(new_fd);
break;
}
if(nbytes == 0)
{
close(new_fd);
break;
}
buffer[nbytes]='\0';
printf("I have received:%s\n",buffer);
if(send(new_fd,buffer,strlen(buffer),0)==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
}
}
int main(int argc,char *argv[])
{
char buff[RECVBUFSIZE];
int sockfd,new_fd,nbytes;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char hello[]="Hello! Socket communication world!\n";
pthread_t tid;
int *pconnsocket = NULL;
int ret,i;
if(argc!=2)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket errror:%s\n\a",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port = htons(portnumber);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
if(listen(sockfd,10)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
pconnsocket = (int *)malloc(sizeof(int));
*pconnsocket = new_fd;
ret = pthread_create(&tid,NULL,rec_func,(void*)pconnsocket);
if(ret<0)
{
perror("pthread_create err");
return -1;
}
}
exit(0);
}
客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#define RECVBUFSIZE 1024
void *func(void *arg)
{
int sockfd,new_fd,nbytes;
char buffer[RECVBUFSIZE];
new_fd=*((int *)arg);
free(arg);
while(1)
{
if((nbytes=recv(new_fd,buffer,RECVBUFSIZE,0))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("I have received:%s\n",buffer);
}
}
int main(int argc,char *argv[])
{
int sockfd;
char buffer[RECVBUFSIZE];
struct sockaddr_in server_addr;
struct hostnet *host;
int portnumber,nbytes;
pthread_t tid;
int *pconnsocket=NULL;
int ret;
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
if(connect(sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
pconnsocket=(int *)malloc(sizeof(int));
*pconnsocket=sockfd;
ret=pthread_create(&tid,NULL,func,(void *)pconnsocket);
if(ret<0)
{
perror("pthread_create err");
return -1;
}
while(1)
{
#if 1
printf("input msg:");
scanf("%s",buffer);
if(send(sockfd,buffer,strlen(buffer),0)==-1)
{
fprintf(stderr,"Write Error:%s\n",strerror(errno));
exit(1);
}
#endif
}
close(sockfd);
exit(0);
}