实现TCP并发服务器之二(多线程)
2012-07-04 08:07
363 查看
通过多线程来实现TCP服务器端和多进程类似,客户端代码同上一篇博客,下面只粘贴服务器端的代码。
编译方法:gcc server.c -o server.out -lpthread
从上面看出主要的改动也就是从创建进程响应请求变成了创建线程响应请求,我这里也只是做个简单的示例,如果要考虑访问全局变量的话,就需要增加锁,互斥信号等方式保证程序的顺利运行,则要复杂得多了。
和多进程相比也有一些不同,比如程序出错不能随便exit,否则主进程也会被关闭。
编译方法:gcc server.c -o server.out -lpthread
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pthread.h> #define MAX_LISTEN 5 #define PORT 1987 #define IP "127.0.0.1" void serve_proc(int conn_fd) { int recv_num; int send_num; char recv_buf[100]; char send_buf[100]; pid_t pid = pthread_self(); printf("client %d started\n", pid); while (1) { //receive recv_num = recv(conn_fd, recv_buf, sizeof(recv_buf), 0); if (recv_num <= 0) { close(conn_fd); break; } recv_buf[recv_num] = '\0'; printf("thread proc %d got : %s\n", pid, recv_buf); if (strcmp(recv_buf,"quit") == 0) { printf("thread proc %d quit\n", pid); break; } //send sprintf(send_buf, "server proc got %d bytes\n", recv_num); send_num = send(conn_fd, send_buf, strlen(send_buf), 0); if (send_num <= 0) { close(conn_fd); break; } printf("thread proc %d sent : %s\n", pid, send_buf); } close(conn_fd); } int main() { int ret; pthread_t id; int conn_fd; int sock_fd = socket(AF_INET,SOCK_STREAM,0); if (sock_fd < 0) { perror("create socket failed"); exit(1); } struct sockaddr_in addr_client; int client_size = sizeof(struct sockaddr_in); struct sockaddr_in addr_serv; memset(&addr_serv, 0, sizeof(addr_serv)); addr_serv.sin_family = AF_INET; addr_serv.sin_port = htons(PORT); addr_serv.sin_addr.s_addr = inet_addr(IP); if (bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in)) < 0) { perror("bind error"); exit(1); } if (listen(sock_fd,MAX_LISTEN) < 0) { perror("listen failed"); exit(1); } while (1) { conn_fd = accept(sock_fd, (struct sockaddr *)&addr_client, &client_size); if (conn_fd < 0) { perror("accept failed"); exit(1); } ret = pthread_create(&id, NULL, (void *)&serve_proc, (void *)conn_fd); if (ret != 0) { perror("create thread error!"); } } close(sock_fd); return 0; }
从上面看出主要的改动也就是从创建进程响应请求变成了创建线程响应请求,我这里也只是做个简单的示例,如果要考虑访问全局变量的话,就需要增加锁,互斥信号等方式保证程序的顺利运行,则要复杂得多了。
和多进程相比也有一些不同,比如程序出错不能随便exit,否则主进程也会被关闭。
相关文章推荐
- Linux网络编程——tcp并发服务器(epoll实现)
- 高性能、高并发TCP服务器(多线程调用libevent)
- 实现TCP并发服务器之五(epoll函数)
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll
- 高性能、高并发TCP服务器(多线程调用libevent)
- 几种并发服务器模型的实现:多线程,多进程,select,poll,epoll - rail
- 高性能、高并发TCP服务器(多线程调用libevent)
- 高性能、高并发TCP服务器(多线程调用libevent)
- TCP并发服务器的几种实现
- Java编程实现多线程TCP服务器完整实例
- C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)
- 高性能、高并发TCP服务器(多线程调用libevent)
- 基于TCP协议用多线程实现并发服务器,实现思路、算法和demo
- 在DragonBoard 410c上实现高并发处理TCP服务器
- Select I/O模型来实现一个并发处理多个客户端的TCP服务器
- 【原创】TCP Socket 简单练习 --- 线程池实现并发服务器 分类: Linux --- 应用程序设计 2014-12-25 13:59 50人阅读 评论(0) 收藏
- 用IOCP实现个简易TCP并发服务器
- 单进程多线程并发服务器实现
- 网络编程(6)单进程多线程并发服务器实现
- tcp多线程并发服务器