Linux下基于多线程的echo

准备开始写一些Linux 下网络编程以及多线程的blog,就从这个简单的echo程序开始吧。

在echo的服务端使用多线程与客户进行通信,可以实现一个服务端程序同时连接多个客户的功能。那么,到底在服务端要有多少个线程呢?

答案是:1+1+n。一个主线程,一个监听(listen)线程,与n个客户进行通信的n个线程。

服务端代码:


 1 #include "../unp.h"
2 #include <pthread.h>
3
4 void* str_echo(void* argv)
5 {
6 int *pcommu = (int*)argv;
7 int sockfd =*pcommu;
8
9 ssize_t n;
10 char buf[MAXLINE];
11
12 while ( (n = read(sockfd,buf,MAXLINE)) > 0) {
13 write(sockfd,buf,n);
14 }
15 }
16
17 void* listen_func(void* argv)
18 {
19 int* plistenfd = (int*)argv;
20 int listenfd = *plistenfd;
21
22 listen(listenfd,LISTENQ);
23 for (;;) {
24 struct sockaddr_in cliaddr;
25 socklen_t clilen = sizeof(cliaddr);
26 int connfd = accept(listenfd,(SA*)&cliaddr,&clilen);
27 pthread_t communication;//通信线程
28 pthread_create(&communication,NULL,&str_echo,&connfd);
29 }
30 }
31
32
33 int main()
34 {
35 int listenfd;
36
37 struct sockaddr_in servaddr;
38
39 listenfd = socket(AF_INET,SOCK_STREAM,0);
40
41 bzero(&servaddr,sizeof(servaddr));
42 servaddr.sin_family = AF_INET;
43 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
44 servaddr.sin_port = htons(SERV_PORT);
45
46 bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
47
48 pthread_t listenPthread;//监听线程
49 pthread_create(&listenPthread,NULL,&listen_func,&listenfd);
50
51 while(1);
52
53 return 0;
54 }

客户端代码:


 1 #include "../unp.h"
2
3 void str_cli(FILE *fp, int sockfd);
4 int main(int argc, char **argv)
5 {
6 int sockfd;
7 struct sockaddr_in servaddr,cliaddr;
8 if (argc != 2) {
9 printf("no IPaddress\n");
10 return 0;
11 }
12
13 sockfd = socket(AF_INET, SOCK_STREAM, 0);
14
15 bzero(&servaddr, sizeof(servaddr));
16 servaddr.sin_family = AF_INET;
17 servaddr.sin_port = htons(SERV_PORT);
18 inet_pton(AF_INET, argv[1],&servaddr.sin_addr);
19
20 connect(sockfd, (SA*) &servaddr, sizeof(servaddr));
21
22 str_cli(stdin,sockfd);
23
24 exit(0);
25 }
26
27 void str_cli(FILE *fp, int sockfd)
28 {
29 char sendline[MAXLINE],recvline[MAXLINE];
30 int n;
31 while (fgets(sendline,MAXLINE,fp) != NULL) {
32 write(sockfd, sendline, strlen(sendline));
33
34 if(n = read(sockfd, recvline, MAXLINE) ) {
35 recvline[n] = 0;
36 fputs(recvline, stdout);
37 }
38 }
39 }

ps,之前在看UNP,客户端代码是UNP里面的。我主要是把UNP里面的服务端的程序改成了多线程的,在原书里是基于多进程的,这样的话服务端一旦运行就堵塞在监听那,改成多线程,单独拿出一个线程来监听可以解决这种情况,主线程可以去做其他的操作,而不会阻塞在listen
 :)。

pps,我在github上放了一个即时聊天的小程序,服务端也是基于多线程的,不过是window下的,而且用的原始的socket
api,准备有时间改成linux+muduo库,感兴趣请戳:github地址

时间: 2024-09-29 23:14:21

Linux下基于多线程的echo的相关文章

Linux 下基于多线程服务器/客服端聊天程序源码

Linux 下基于多线程服务器/客服端聊天程序,采用阻塞的socket技术,和多线程技术实现. 客服端程序:client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>

Linux下模拟多线程的并发并发shell脚本

分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用.     以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包.#!/bin/baship=`cat iplist.txt|grep -v "#"|awk '{print $1}'`   #过滤服务器IPdir='/usr/l

Linux下基于nw音乐电台

Linux下基于nw音乐电台,希望大神改进 百度云:下载

Linux下基于源码方式安装MySQL 5.6

MySQL为开源数据库,因此可以基于源码实现安装.基于源码安装有更多的灵活性.也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码,根据不同的软件平台环境调整相关的编译参数,选择自身需要选择不同的安装组件,设定需要的字符集等等一些可以根据特定应用场景所作的各种调整.本文描述了如何在源码方式下安装MySQL. 1.安装环境及介质#安装环境SZDB:~ # cat /etc/issueWelcome to SUSE Linux Enterprise Server 10 SP3

linux下的多线程

1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程.现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux. 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题. 使用多线程的理由之一是和进程相比,它

【转】Linux下的多线程编

作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/2807484.html 本文作者: 姚继锋 (2001-08-11 09:05:00) 黄鹏程(2009-03-13) converse (2009-01-15) 1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传

【转】Linux下的多线程编程

1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程.现在,多线程技术已经被许多操作系统所支持,包括Windows也包括Linux.  为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题.  使用多线程的理由之一是和进程相比,它是一种非

Linux下基于Erlang的高并发TCP连接压力实验

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

Linux下的多线程编程

1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程.现在,多线程技术已经被许多操作系统所支 持,包括Windows也包括Linux. 为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?我们首先必须回答这些问题. 使用多线程的理由之一是和进程相比,它是一种非常