实现TCP并发服务器之二(多线程)
来源:互联网 发布:淘宝选品的四项指标 编辑:程序博客网 时间:2024/05/15 09:00
通过多线程来实现TCP服务器端和多进程类似,客户端代码同上一篇博客,下面只粘贴服务器端的代码。
编译方法: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) {//receiverecv_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;}//sendsprintf(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,否则主进程也会被关闭。
- 实现TCP并发服务器之二(多线程)
- tcp多线程并发服务器
- 实现TCP并发服务器之三(select函数)
- 实现TCP并发服务器之四(poll函数)
- 实现TCP并发服务器之五(epoll函数)
- TCP并发服务器模型(二)
- Linux TCP 服务器编程(二):简单的并发服务器
- linux(二)------多线程并发服务器
- Linux网络编程——tcp并发服务器(多线程)
- Linux网络编程——tcp并发服务器(多线程)
- Linux网络编程——tcp并发服务器(多线程)
- TCP并发服务器之进程
- tcp并发服务器之线程
- TCP并发服务器实例--多线程
- TCP多线程并发服务器+线程池+echo
- lesson6 基于多线程的tcp并发服务器
- 网络编程资料总结(二)----Tcp多线程服务器和客户端的实现
- 基于TCP协议用多线程实现并发服务器,实现思路、算法和demo
- php中的魔术函数以及魔术常量
- VC++ 线程池
- Java中finalize()
- javascript同源策略和跨域实验及其跨域解决办法
- 服务器的1U,2U是什么概念
- 实现TCP并发服务器之二(多线程)
- C++ How To Program整理(7)
- 解决Ubuntu wireshark找不到Interface问题
- 【深入理解数据结构】二叉树实践
- Android ArrayAdapter 详解
- 合格程序员每天每周每月每年应该做的事
- Django基础学习之Cookie 和 Sessions 应用
- JSon SuperObject 研究2:数据集与JSON对象互转
- /usr/bin/ld: cannot find -lsqlite3