您的位置:首页 > 理论基础 > 计算机网络

Linux下C语言多线程,网络通信简单聊天程序

2011-01-06 17:30 459 查看
功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天。但至今没想出合适的退出机制,除了用Ctr+C。出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端。应用select函数来实现异步的读写操作。

     先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环。这样每当有一个新的“连接”被接受都会创建一个新的线程,实现1对N的网络通信。在服务端程序中线程中用一个buffer读写,为了避免错误,这时就要给关键代码加上互斥锁work_mutex,具体见代码。

客户端代码

#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<string.h>
#include<sys/types.h>
#include<sys/time.h>

int main(){
int result;
int socketfd;
int len;
struct sockaddr_un address;
fd_set read_fds, test_fds;
int fd;
int max_fds;
char buffer[1024];

socketfd = socket(AF_UNIX, SOCK_STREAM, 0);

address.sun_family = AF_UNIX;
strcpy(address.sun_path, "server_socket");
len = sizeof(address);

result = connect(socketfd, (struct sockaddr*)&address, len);
if(result == -1){
perror("connect");
exit(EXIT_FAILURE);
}

FD_ZERO(&read_fds);
FD_SET(0, &read_fds);
FD_SET(socketfd, &read_fds);
max_fds = socketfd +1;

printf("Chat now!!\n");

while(1){
test_fds = read_fds;
result = select(max_fds, &test_fds, (fd_set *)NULL, (fd_set *)NULL, (struct timeval*)NULL);
if(result < 1){
perror("select");
exit(EXIT_FAILURE);
}

if(FD_ISSET(0, &test_fds)){
memset(buffer, '\0', sizeof(buffer));
//    printf("send:");
fgets(buffer, sizeof(buffer), stdin);
if((strncmp("quit", buffer, 4))== 0){
printf("\nYou are going to quit\n");
break;
}
result = write(socketfd, buffer, sizeof(buffer));
if(result == -1){
perror("write");
exit(EXIT_FAILURE);
}
}
if(FD_ISSET(socketfd, &test_fds)){
memset(buffer, '\0', sizeof(buffer));
result = read(socketfd, buffer, sizeof(buffer));
if(result == -1){
perror("read");
exit(EXIT_FAILURE);
}else if(result == 0){
printf("The other side has termianl chat!\n");
break;
}else{
printf("recieve: %s", buffer);
}
}
}
close(socketfd);
exit(EXIT_SUCCESS);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: