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网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 使用Dropzone上传图片及回显演示样例
一.图片上传所涉及到的问题 1.HTML页面中引入这么一段代码 <div class="row"> <div class="col-md-12" ...
- [Angular] Component's dependency injection
An Angular service registered on the NgModule is globally visible on the entire application. Moreove ...
- 单词数 (STL set集合)
单词数 Problem Description lily的好朋友xiaoou333近期非常空.他想了一件没有什么意义的事情.就是统计一篇文章里不同单词的总数.以下你的任务是帮助xiaoou333解决问 ...
- Spring进阶之路(10)-Advice简单介绍以及通过cglib生成AOP代理对象
Advice简单介绍 1. Before:在目标方法运行之前运行织入.假设Before的处理中没有进行特殊的处理.那么目标方法终于会运行,可是假设想要阻止目标方法运行时.能够通过抛出一个异常来实现.B ...
- java 递归实现删除或查询指定目录下的全部文件
/** * 递归列举盘符下的全部文件的名称,如E:\HeartIsland * * @author HeartIsland * */ public class FileListDemo { /** * ...
- [Java开发之路](7)RandomAccessFile类具体解释
RandomAccessFile适用于大小已知的记录组成的文件.提供的对文件訪问.既能够读文件.也能够写文件,而且支持随机訪问文件.能够訪问文件的任何位置. 文件里记录的大小不一定都同样.仅仅要我们知 ...
- bfs初学
BFS: ** 当知道初始和目标状态的,用双向BFS: 无权图最好用BFS 不用重复如队** 实现框架: 抄来的(来源:https://www.luogu.org/blog/stephen2333/s ...
- kubernetes系列:(二)、kubernetes部署mysql(单节点)
使用kubeadm搭建好kubernetes集群后就可以动手部署自己的应用了. 本文用例来自官网,如有需要请参看 kubernetes官网 一.环境说明 kubernetes 1.13.1 docke ...
- ubuntu sublime text 2 破解版
原网地址 : http://blog.csdn.net/icephone/article/details/8217567 关于sublime text 2 的一个使用教程以及前端的不错的学习博客 ht ...
- Tomcat 初探(一) 简介
简述 大部分入了 Java 开发这个坑的朋友,都需要把自己的网站发布到 Web 服务器上,相信也听过 Tomcat 的鼎鼎大名.Tomcat 是由 Sun 公司软件架构师詹姆斯·邓肯·戴维森开发的 W ...