Linux下C语言多线程,网络通信简单聊天程序
2011-01-06 17:30
459 查看
功能描述:程序应用多线程技术,可是实现1对N进行网络通信聊天。但至今没想出合适的退出机制,除了用Ctr+C。出于演示目的,这里采用UNIX域协议(文件系统套接字),程序分为客户端和服务端。应用select函数来实现异步的读写操作。
先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用accept函数,接受“连接”请求,然后调用创建线程函数,创造新的线程,进入下一个循环。这样每当有一个新的“连接”被接受都会创建一个新的线程,实现1对N的网络通信。在服务端程序中线程中用一个buffer读写,为了避免错误,这时就要给关键代码加上互斥锁work_mutex,具体见代码。
客户端代码
先说一下服务端:首先先创建套接字,然后绑定,接下进入一个无限循环,用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); }
相关文章推荐
- Linux下C语言多线程,网络通信简单聊天程序
- Linux下C语言多线程,网络通信简单聊天程序
- Linux下C语言多线程网络通信简单聊天程序
- 网络通信(一):简单的聊天程序
- Linux下C语言多线程,网络通信简单聊天程序
- Linux下实现类似QQ的通信(简单聊天程序)
- linux下简单的TCP服务端与客户端进行网络通讯的程序
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- Linux下两个程序进行socket通信的简单例子
- 网络编程 笔记(一) 基于 Linux简单通信
- linux下一个简单的TCP通信程序——客户端向服务端发送任意字符串
- 一个简单的linux下网络程序实例-网络编程入门 收藏
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
- Linux 下简单TCP通信程序
- linux下java程序与C语言程序通过SOCKET通信的简单例子
- Linux套接字实现简单的客户/服务器网络通信示例
- linux下java程序与C语言程序通过SOCKET通信的简单例子
- 一个简单的linux下网络程序实例-网络编程入门