linux网络编程
chmy1992
这个作者很懒,什么都没留下…
展开
-
共享内存
共享内存区是最快的IPC形式,一旦这样的内存映射到共享他的进程的地址空间,这些进程间的数据传递就不在涉及到内核,换句说就是进程不在通过执行进入到内核的系统调用来传递彼此的数据。void *mmap(void *addr,size_t len, int prot,int flags, int fd,off_t offset);功能:将文件或者设备空间映射到共享原创 2017-08-07 19:13:27 · 295 阅读 · 0 评论 -
并发服务器epoll
Select两个限制:1,一个进程能够打开的文件描述符个数室友限制的2, FD_SETSIZE限制Poll限制:1,一个进程能够打开的最大文件描述符是有限的通过ulimit –n numbe可以更改这个上限,但是系统能够打开的最大文件描述的个数是有限制的(内存有关),通过cat /proc/sys/fs/file-max可以查看最大限制。Select和poll共同点:内原创 2017-08-03 15:28:36 · 228 阅读 · 0 评论 -
网络编程UDP
UDP特点:1. 无连接,不维护端到端的状态。2. 基于消息的数据传输服务,TCP是基于流的传输服务,因此TCP会出现粘包问题,而UDP不会有这种问题,认为数据包之间是有边界的。3. 不可靠,数据包可能会丢失,乱序,重复,缺乏流量控制4. 一般情况下UDP更加高效UDP注意点:1. UDP报文可能丢失,重复2. UDP报文可能会乱序3. UDP缺乏流量控制原创 2017-08-03 17:37:56 · 219 阅读 · 0 评论 -
多线程服务器
Posix线程库:a) 与线程有关的函数都构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的。。b) 要使用这些库函数,要引入头文件。c) 链接这些线程库函数时要使用编译命令的”-lpthread”选项。int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void*(*start_to原创 2017-08-06 10:34:32 · 299 阅读 · 0 评论 -
线程属性
线程属性1. 初始化与销毁属性int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);2. 获取与设置分离属性int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachst原创 2017-08-06 16:16:26 · 173 阅读 · 0 评论 -
线程特定数据
1. 在单线程程序中,我们经常用到全局变量以实现在多个函数间共享数据。2. 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程共有。3. 但有时应用程序设计中有必要提供私有的全局变量,仅在某个线程中有效,却可以跨多个函数访问。4. POSIX线程库通过维护一定的数据结构来解决这个问题,这些个数据成为TSD(Thread-specific Data)。相关函数:原创 2017-08-06 16:17:07 · 265 阅读 · 0 评论 -
POSIX信号量和互斥锁
POSIX信号量1 创建信号量sem_t *sem_open(const char *name, int oflag);sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);功能:初始化有名信号量int sem_init(sem_t *sem, int pshared, uns原创 2017-08-06 21:08:00 · 549 阅读 · 0 评论 -
线程和进程
程序和进程程序:完成特定功能的一系列指令的集合进程:程序的一次动态执行,代码段+数据段+堆栈段+PCB一个进程只能对应一个程序,一个程序可以对应多个进程线程:a) 在一个程序里的一个执行路线就叫做线程,更准确的定义是:线程是“一个进程内的控制序列”b) 一切进程至少都有一个执行线路进程和线程的差别:a) 进程是资源竞争的基本单位b) 线程是程序执行的最小单位原创 2017-08-05 21:07:42 · 240 阅读 · 0 评论 -
POSIX 条件变量
条件变量:条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直到某特殊情况发生为止。通常条件变量和互斥锁同时使用。因此, 当一个线程互斥的访问某个变量时,它可能发现在其它线程改变状态之前,它什么也做不了。例如一个线程访问队列时,发现队列为空时,他只能等待,直到其它线程将一个节点添加到队列中。这种情况就可以用到条件变量。int pthread_cond_init(pthrea原创 2017-08-06 22:40:48 · 382 阅读 · 0 评论 -
死锁与哲学家就餐问题
死锁:死锁是指多个资源之间互相等待对方的资源,而在得到对方的资源之前又不释放自己的资源,这样,造成循环等待的一种现象,如果所有进程都在互相等待一个不可能发生的事件,则进程就死锁了。死锁产生的必要条件:1. 互斥条件:进程对资源进行排他性使用,即在一段时间内对某资源仅为一个进程所占用2. 请求和保持条件:当进程因请求资源而阻塞时,对已获得得资源保持不放3. 不可剥夺条件:进程已获得得原创 2017-08-07 14:18:49 · 1729 阅读 · 1 评论 -
并发服务器poll
用select实现的并发服务器,能达到的并发数,受两方面的限制:1. 一个进程能打开的最大文件描述符限制,这个可以通过调整内核参数。2. Select中的fd_set集合容量的限制(FD_SETSIZE),这需要重新编译内核poll提供的功能与select相似,不过在处理流设备时,他能够提供额外的信息,相比于select来说,因为select对于事件不太统一,编程比较繁琐,而poll对原创 2017-08-03 13:20:10 · 305 阅读 · 0 评论 -
网络编程中的close和shutdown
close终止了数据传送的两个方向,而shutdown可以有选择的终止某个方向的数据传送或者终止数据传送的两个方向,例如shutdown how=1就可以保证对等方接收到一个EOF字符,而不管其他进程是否已经打开了套接字。而close不能保证,知道套接字引用计数减到0时才发送,也就是说直到所有的进程都关闭了套接字。if(pid==0){close(listenfd);…clos原创 2017-08-03 10:32:26 · 462 阅读 · 0 评论 -
并发服务器select
思想:用select管理多个IO,一旦其中一个IO或者多个IO检测到我们感兴趣的时间,select函数返回,返回值为检测到的事件个数。并且会返回哪些IO发生了事件,遍历这些事假然后处理它。函数int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout原创 2017-08-02 22:39:17 · 287 阅读 · 0 评论 -
System V共享内存
头文件#include#includeintshmget(key_t key,size_t size,int shmflg)功能:用来创建共享内存参数:a) key:这个共享内存段名字b) size:共享内存大小c) shmflg:由几个权限标志构成,他们的用法和创建文件时使用的model模式标志是一样的返回值:成原创 2017-08-07 19:42:26 · 266 阅读 · 0 评论 -
数字和为sum的方法数
题目描述给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。输入描述:输入为两行:第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)第二行为n个正整数A[i](32位整数),以空格隔开。输出描述:输出所求的方案数示例原创 2017-08-08 17:15:03 · 375 阅读 · 0 评论 -
一个简单的网络通信程序
服务器端:#include#include#include#include#include#include#include#includeint main(){ int listenfd; listenfd=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in servaddr; memset(&serva原创 2017-08-02 09:43:04 · 1404 阅读 · 0 评论 -
点对点通网络通信程序
服务器端、#include#include#include#include#include#include#include#include#includevoid handler(int sig){ printf("recv a sig=%d\n",sig); exit(EXIT_SUCCESS);}int main(){ int l原创 2017-08-02 09:47:02 · 340 阅读 · 0 评论 -
发送定长宝解决网络粘包问题
产生粘包问题的原因有以下几个:• 第一 。应用层调用write方法,将应用层的缓冲区中的数据拷贝到套接字的发送缓冲区。而发送缓冲区有一个SO_SNDBUF的限制,如果应用层的缓冲区数据大小大于套接字发送缓冲区的大小,则数据需要进行多次的发送。• 第二种情况是,TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送。• 第三种情况由于链路层最大发送单原创 2017-08-02 09:50:31 · 213 阅读 · 0 评论 -
网络编程获得本机IP
#include#include#include#include#include#include#include#include#include#include#define ERR_EXIT(m) do{perror(m);exit(EXIT_FAILURE);}while(0)int main(){ char host[100]; if (gethostname(h原创 2017-08-02 14:41:32 · 290 阅读 · 1 评论 -
按行读取解决粘包问题
该方案,每次读取时当读到‘\n’换行符时,读取该行服务器端:#include#include#include#include#include#include#include#include#include#define ERR_EXIT(m) do{perror(m);exit(EXIT_FAILURE);}while(1)struct packet{ int原创 2017-08-02 15:10:08 · 260 阅读 · 0 评论 -
linux网络多进程编程处理僵尸进程
前面的多进程程序中,当客户端关闭后,一个子进程会关闭,但是其pdb仍然存在,通过ps -ef|grep server可以查看到,对于服务器来说,大量的僵尸进程会消耗进程控制块数目,影响服务器性能,因此僵尸进程必须处理。什么是僵尸进程?首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息。这些信息至少包括进程原创 2017-08-02 15:37:42 · 606 阅读 · 0 评论 -
TCP的十一种状态
Connect主动发起连接,此时的状态为SYN_SENT,aceept接收到SYN信号后,进入到SYN_RCVD状态,然后发送一个SYN信号和应答信号,并且消耗一个序列号,然后客户端返回一个应答信号,此时双方都进入ESTABLISHID,这就是三次握手。假设客户端主动关闭,此时客户端发送一个FIN信号,此时服务器端返回为0,然后发送一个确认信号,服务器端进入CLOSE_WAIT状态,客户端进F原创 2017-08-02 16:30:31 · 391 阅读 · 0 评论 -
进程通信值pipe管道
1. 基本概念管道是一种把两个进程之间的标准输入和标准输出连接起来的机制。管道是一种历史悠久的进程间的通信的方法,自从unix操作系统诞生之初,管道就存在了。进程创建管道,每次创建两个文件描述符来操作管道。其中一个队管道进行写操作,另一个描述符对文件进行读操作。下图显示了管道如何将两个进程通过内核连接起来的状态。管道是半双工的,只能由一端发一端接收,因此如果要实现全双工通信,必须要原创 2017-08-07 15:24:11 · 217 阅读 · 0 评论