您的位置:首页 > 运维架构 > Linux

基于linux下控制台,多线程并发控制的聊天程序(服务器端)

2009-09-24 17:29 423 查看
废话不多说了

把源代码贴上来吧

留作以后学习的参考和回顾

涉及多线程,DGRAM socket编程

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>
#define PORT 4000
#define MAXBUFLEN 100

char recvbuf[MAXBUFLEN];
char sendbuf[MAXBUFLEN];
char dialog[MAXBUFLEN*8];
struct sockaddr_in their_addr;
struct sockaddr_in my_addr;
int sockfd;
void fatal(char *mes)
{
perror(mes);
exit(1);
}
void getmessage(void)
{
while(1)
{
int sock_len=sizeof(struct sockaddr);
int numget;
if((numget=recvfrom(sockfd,recvbuf,MAXBUFLEN,0,
(struct sockaddr *)&their_addr,&sock_len))==-1)
fatal("recvfrom");

recvbuf[numget]='/n';
recvbuf[numget+1]='/0';
//take care of next expression,maybe error will be brought
strcat(dialog,recvbuf);
system("clear");
printf("%s",dialog);
}

}
int main()
{
pthread_t tid;
int rtn;
dialog[0]='/0';

if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
fatal("socket");
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(PORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
fatal("bind");

rtn=pthread_create(&tid,NULL,(void *)getmessage,NULL);
if(rtn!=0)
fatal("pthread_create");

while(1)
{
//scanf("%s",sendbuf);
gets(sendbuf);
sendbuf[strlen(sendbuf)]='/n';
sendbuf[strlen(sendbuf)+1]='/0';
strcat(dialog,sendbuf);
system("clear");
printf("%s",dialog);

if(sendto(sockfd,sendbuf,sizeof(sendbuf),0,
(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1)
fatal("sendto");
}

close(sockfd);
exit(0);
}


编译: gcc -lpthread -o talk talk.c

运行可执行文件:./talk

然后就可以自由的聊天了

可以连续发送,连续接受

带清屏幕效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: