利用linux socket实现异步聊天有2种方式:
第一,利用多进程编程fork()函数实现
第二,利用select()函数实现
本文采用多进程方式实现,利用select()函数实现的聊天还存在一些问题,以后调试好了再上传。。。。
本程序只实现了一些简单点对点聊天功能,
服务器:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include int sockfd,new_fd;
static void sig_exit(int signumber)
{
close(new_fd);
close(sockfd);
}
main()
{
struct sockaddr_in my_addr,their_addr;
int ret;
int flags;
char buffer[100];
char recvbuf[100];
int maxfd;
struct timeval tv;
pid_t pid;
fd_set rfds;
tv.tv_sec=5;
tv.tv_usec=0;
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("socket error");
exit(0);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(9999);
my_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bzero(&(my_addr.sin_zero),8);
ret=bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr));
if(ret<0)
{
printf("bind error");
exit(0);
}
ret=listen(sockfd,10);
if(ret<0)
{
printf("listen error");
exit(0);
}
signal(SIGTTIN,SIG_IGN);
while(1)
{
int sin_size=sizeof(struct sockaddr_in);
new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&sin_size);
if(new_fd<0)
{
printf("accept error");
exit(0);
}
printf("server:got connect from %s\n",inet_ntoa(their_addr.sin_addr));
if((pid=fork())==-1)
{
printf("fork error");
exit(0);
}
else if(pid==0)
{
while(1)
{
printf("input send data:");
bzero(buffer,101);
if(fgets(buffer,100,stdin)==NULL)
{
exit(0);
}
if(!strncasecmp(buffer,"quit",4))
{
send(new_fd,buffer,strlen(buffer),0);
printf("quit\n");
close(new_fd);
close(sockfd);
exit(0);
}
if(send(new_fd,buffer,strlen(buffer),0)==-1)
{
printf("send error");
break;
}
}
}
else
{
signal(SIGCHLD,sig_exit);
while(1)
{
if((ret=read(new_fd,recvbuf,100))==-1)
{
exit(0);
}
recvbuf[ret]='\0';
if(!strncasecmp(recvbuf,"quit",4))
{
close(new_fd);
close(sockfd);
exit(0);
}
printf("\nyou have message:%s",recvbuf);
}
}
break;
}
}
客户端:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include int sockfd;
static void sig_exit(int signumber)
{
close(sockfd);
}
int main()
{
int numbytes;
int ret;
char buffer[100];
char recvbuf[100];
fd_set rfds;
pid_t pid;
struct hostent *he;
int maxfd;
struct sockaddr_in their_addr;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
printf("socket error");
exit(0);
}
their_addr.sin_family=AF_INET;
their_addr.sin_port=htons(9999);
their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(their_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
{
printf("connect error");
exit(0);
}
signal(SIGTTIN,SIG_IGN);
while(1)
{
if((pid=fork())==-1)
{
printf("fork error");
exit(0);
}
else if(pid==0)
{
while(1)
{
printf("input send data:");
if(fgets(buffer,100,stdin)==NULL)
{
exit(0);
}
if(!strncasecmp(buffer,"quit",4))
{
send(sockfd,buffer,strlen(buffer),0);
printf("quit\n");
close(sockfd);
exit(0);
}
if(send(sockfd,buffer,100,0)==-1)
{
printf("send error");
exit(0);
}
}
}
else
{
signal(SIGCHLD,sig_exit);
while(1)
{
if((ret=read(sockfd,recvbuf,100))==-1)
{
printf("recv error");
exit(0);
}
if(!strncasecmp(recvbuf,"quit",4))
{
close(sockfd);
exit(0);
}
recvbuf[ret]='\0';
printf("\nyou have message:%s",recvbuf);
}
}
}
}