Linux网络编程(3)——多进程、多线程
在我的里面已经介绍了linux以下c的进程、线程接口,这里就不做过多阐述了。
多进程
这里多进程採用传统的多进程模型。每当有client发来的连接时创建一个进程来处理连接,一个子进程相应一个连接。
有了上篇单一进程的基础,此处仅仅做简单的改动便能够实现。
while(1){
clientfd = Accept(servfd, (struct sockaddr*)&cliaddr, &clientlen);
host = Gethostbyaddr((const char*)&cliaddr.sin_addr.s_addr, sizeof(cliaddr.sin_addr.s_addr), AF_INET);
printf("server connect to host: %s %s\n",host->h_name, inet_ntoa(cliaddr.sin_addr));
if ((child_pid = Fork()) == 0){
Close(servfd);
echo(clientfd);
Close(clientfd);
}
Close(clientfd);
}
仅仅须要在while里面加入进程的创建就可以,然后在子进程里先关闭父进程的监听套接字。
当然。不要忘了在上面加入Fork错误处理的包裹函数(在Fork一节中已讲到)。
void error_msg(char *msg){
perror(msg);
exit(0);
} int Fork(){
pid_t pid;
if ( ( pid = fork() ) < 0 )
error_msg("fork failed");
return pid;
}
执行结果:
client:
server:
多线程
线程和进程在非常多方面是相通的,仿照上面的多进程的传统模型。不难实现多线程的传统模型。
依旧是在while里面做简单的改动就可以。
clientfd = (int*)malloc(sizeof(int));
*clientfd = Accept(servfd, (struct sockaddr*)&cliaddr, &clientlen);
host = Gethostbyaddr((const char*)&cliaddr.sin_addr.s_addr, sizeof(cliaddr.sin_addr.s_addr), AF_INET);
printf("server connect to host: %s %s\n",host->h_name, inet_ntoa(cliaddr.sin_addr));
Pthread_create(&tid, NULL, &thread, clientfd);
Close(*clientfd);
使用malloc是为了避免因为多线程訪问了同样的clientfd从而出现无法预估的后果,全部手动分配。
线程函数为
void *thread(void* arg){
int clientfd = *((int*)arg);
free(arg);
Pthread_detach(pthread_self());
echo(clientfd);
close(clientfd);
return NULL;
}
执行结果:
这段代码有个问题,clientfd传入线程之后。arg指针没有接收到值,指在了一个无法訪问的地方(gdb显示值为0x00),百思不得其解。
(原理非常easy,遇到的问题先记录下,假设有人知道错在哪里希望能指正出来。。
。
环境 ubuntu 64位,编译器gcc)
Linux网络编程(3)——多进程、多线程的更多相关文章
- linux网络编程echo多进程服务器
echo_server 多进程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #incl ...
- day31 网络编程,多进程多线程
今天的内容需要好好整理,概念性的东西比较多,都是需要理解的,这些是基层的理解,后期的很多知识都是要建立在今天的概念基础上的,以下两点是核心内容,必须要理解,自己把自己理解的注释加在里面: 进程就是程序 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- 很全的linux网络编程技巧
本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- HDU 4394 BFS
M2%10x=N (x=0,1,2,3....) 给出N.找到最小的满足条件的M 因为:N的个位仅仅由M的个位决定.N十位由M的个位和十位决定,N的百位由M的个位十位百位决定.以此类推 全部从个位開始 ...
- SwipeRefreshLayout与ViewPager滑动事件冲突解决
问题描写叙述: 开发中发现,SwipeRefreshLayout的下拉刷新,与ViewPager开发的banner的左右滑动事件有一点冲突,导致banner的左右滑动不够顺畅. 非常easy在bann ...
- poi判断一行是隐藏的getZeroHeight()
poi判断一行是隐藏的 getZeroHeight() boolean isZeroHeight = row.getZeroHeight(); if(isZeroHeight){ // 如果为隐藏行就 ...
- Spring+MyBatis双数据库配置
Spring+MyBatis双数据库配置 近期项目中遇到要调用其它数据库的情况.本来仅仅使用一个MySQL数据库.但随着项目内容越来越多,逻辑越来越复杂. 原来一个数据库已经不够用了,须要分库分表.所 ...
- 51NOD 1686 第K大区间 二分
第k大区间 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数n和k(1<=n<=100000,k<=n* ...
- java格式化时间到毫秒
转自:https://blog.csdn.net/iplayvs2008/article/details/41910835 java格式化时间到毫秒: SimpleDateFormat formatt ...
- No changes detected or App 'blog' could not be found. Is it in INSTALLED_APPS?
出现该问题的原因: django没有在setting.py的配置文件中找到app内容,需要增加app的名称 E:\PycharmProjects\Mysite>python manage.py ...
- mysql授予IP远程访问访问语句
mysql -u root -p; GRANT ALL PRIVILEGES ON *.* TO '用户名'@'你的IP地址' IDENTIFIED BY '密码' WITH GRANT OPTION ...
- Centos下MongoDB数据库的安装以及配置开机自启动(三)
最近写了一个用node来操作MongoDB完成增.删.改.查.排序.分页功能的示例,并且已经放在了服务器上地址:http://39.105.32.180:3333. 在服务器上完全可以用yum来安装管 ...
- PHP分页组件:Paginator
安装 composer require "jasongrimes/paginator:~1.0" 使用 <?php require '../vendor/autoload.p ...