随笔分类 -  Linux Programming

摘要:What is it? TIME-WAIT状态的主要作用在于TCP连接的拆除阶段。拆除一个TCP连接通常需要交换4个segment,如下图所示: Host1上的应用程序关闭了自己这一端的连接,使得TCP向Host 2发送了一个FIN。Host 2对这个FIN进行ACK,并将这个FIN作为一个EOF传送给应用程序(假设Host 2上的应用程序有一个挂起的read操作)。经过一段时间后,Hos... 阅读全文
posted @ 2015-08-14 21:52 Acjx 阅读(902) 评论(0) 推荐(0)
摘要:1. Introduction We now turn to the process control provided by the UNIX System. This includes the creation of new processes, program execution, and process termination. We also look at the various... 阅读全文
posted @ 2015-07-23 18:02 Acjx 阅读(864) 评论(0) 推荐(0)
摘要:4.1 Introduction 4.2 stat, fstat, fstatat, and lstat Functions The lstat function is similar to stat, but when the named file is a symbolic link, lstat returns information about the symbolic link,... 阅读全文
posted @ 2015-05-04 21:57 Acjx 阅读(734) 评论(0) 推荐(0)
摘要:引言 让服务器在启动阶段调用fork创建一个子进程池,通过子进程来处理客户端请求。子进程与父进程之间使用socketpair进行通信(为了方便使用sendmsg与recvmsg,如果使用匿名管道,则无法使用以上两个函数)。以下针对TCP进行分析。 server端使用select轮询用于监听客户端请求的被动套接字fd_listen以及用于父子之间通信的socketpair。每当客户端有请求时,ser... 阅读全文
posted @ 2014-09-11 12:39 Acjx 阅读(1360) 评论(0) 推荐(1)
摘要:引言 本文会写一个并发服务器(concurrent server)程序,它为每个客户请求fork出一个子进程。 注意 1. 信号处理问题 对于相同信号,按信号的先后顺序依次处理。可能会产生的问题是,正在处理sig1信号时,又来了2个或更多的sig1信号,此sig1时只会在处理完原来的sig1信号后,再处理1个sig1信号。因此对于相同信号,会产生信号掉包的问题。 一个儿子退了之后,程序在处理han... 阅读全文
posted @ 2014-09-06 11:08 Acjx 阅读(754) 评论(2) 推荐(0)
摘要:思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置。msg结构体如下: /* 用于发给对方的信息 */typedef struct tag_msg{ int msg_type; /* 悔棋? */ int msg_color; int msg_row; int msg_col;}MSG, *pMSG;2.... 阅读全文
posted @ 2014-09-04 21:16 Acjx 阅读(1086) 评论(0) 推荐(0)
摘要:具体生成动态库的操作及使用该动态库的操作请参见上篇博文。以下仅仅列出改进版本的代码。 代码 my_socket.h #ifndef __MY_SOCKET_H__#define __MY_SOCKET_H__#include #include #include #include #include #include #include #include #define IN#define OUT#de... 阅读全文
posted @ 2014-09-04 00:38 Acjx 阅读(912) 评论(0) 推荐(0)
摘要:引言 每次使用socket通信,都会有很对相似的操作。本文,会对TCP与UDP通信做一简单封装,并生成动态库。 代码 my_socket.h #ifndef __MY_SOCKET_H__#define __MY_SOCKET_H__#include #include #include #include #include #include #include #include #define IN#... 阅读全文
posted @ 2014-09-01 20:58 Acjx 阅读(1531) 评论(1) 推荐(0)
摘要:思路 主线程负责发送消息,另一线程负责接收消息。服务端和客户端均是如此。 注意 当A方close掉用于通信的socket端口后,该端口是不会立即关闭的。因为此时可能B方的信息还没send完。因此,此时A方的recv仍旧处于阻塞状态,会最后再等待收一次信息。此时,当B方send一个信息给A后,A方recv到后,A的socket端口就正式关闭了,A的recv返回-1。 此时由于A的socket端口已关... 阅读全文
posted @ 2014-08-31 16:42 Acjx 阅读(833) 评论(0) 推荐(0)
摘要:需求 当客户端连接上服务器后,服务器会将相应文件传输给客户端,实现文件下载。 思路 服务器端,主进程负责listen。循环内,主进程每从任务请求队列中accept出一个请求,就fork出孙子完成文件传输。注意:如果只是fork出儿子,那么主进程就得wait儿子,这样的话,只有当给一个客户端传完文件后才能下一个。 代码 server端 /*******************************... 阅读全文
posted @ 2014-08-31 12:27 Acjx 阅读(2126) 评论(0) 推荐(0)
摘要:引言 本文实现的功能类似于我之前所写的一篇博文(Linux之select系统调用_2),区别在于进程之间的通信方式有所不同。之前的文章中,我所使用的是管道,而本文我将会使用socket接口。 需求 客户端发送消息给服务器,服务器收到消息后,会转发该消息给所有客户端。 思路 1. server端维护一个链表,用于存放客户端的联系方式。结构如下: typedef struct sockaddr_in ... 阅读全文
posted @ 2014-08-30 00:14 Acjx 阅读(1510) 评论(0) 推荐(0)
摘要:TCP与UDP通信流程 TCP通信的基本步骤如下: 服务端:socket---bind---listen---while(1){---accept---recv---send---close---}------close 客户端:socket------------------------------connect---send---recv-----------------close UDP... 阅读全文
posted @ 2014-08-29 21:50 Acjx 阅读(767) 评论(0) 推荐(0)
摘要:宏定义 首先介绍两个宏定义,看如下代码 代码1 /************************************************************************* > File Name: test.c > Author: KrisChou > Mail:zhoujx0219@163.com > Created Time: Thu 28 Aug 2014... 阅读全文
posted @ 2014-08-28 17:04 Acjx 阅读(463) 评论(0) 推荐(0)
摘要:socket信息数据结构 #include struct sockaddr { unsigned short sa_family; /*地址族*/ char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号。*/};struct sockaddr_in { short int sa_family; ... 阅读全文
posted @ 2014-08-28 01:25 Acjx 阅读(455) 评论(0) 推荐(0)
摘要:数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式。内存的高地址存储数据的低字节,低地址存储数据高字节的方式称为大端模式。 eg:对于内存中存放的数0x12345678来说(注意,对于数据而言,此处12是高字节,78是低字节;对于地址而言,左边是低地址,右边是高地... 阅读全文
posted @ 2014-08-27 22:43 Acjx 阅读(2011) 评论(0) 推荐(0)
摘要:需求 客户端将需要解决的task发送给服务器,服务器调用线程来解决客户端发送的task,解决完由线程负责将其发送回客户端。(用管道实现通信) 思路 1. server维护两个列表。一是客户端列表。二是任务列表。分别如下: /* 客户端列表 */ typedef struct tag_fds{ int s_rfd ; int s_wfd ; struct tag_fds* s... 阅读全文
posted @ 2014-08-27 01:20 Acjx 阅读(367) 评论(0) 推荐(0)
摘要:思路 生产者和消费者(互斥与同步)。资源用队列模拟(要上锁,一个时间只能有一个线程操作队列)。 m个生产者。拿到锁,且产品不满,才能生产。当产品满,则等待,等待消费者唤醒。当产品由空到不空,通知消费者。n个消费者。拿到锁,且有产品,才能消费。当产品空,则等待,等待生产者唤醒。当产品由满到不满,通知生产者。 生产者条件:队列不满消费者条件:队列不空因此有两个条件变量。 代码 /***********... 阅读全文
posted @ 2014-08-27 00:07 Acjx 阅读(938) 评论(0) 推荐(0)
摘要:引言 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待条件变量的条件成立而挂起(此时不再占用cpu);另一个线程使条件成立(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 函数原型 1. 定义条件变量 #include /* 定义两个条件变量 */pthread_cond_t cond_pro, cond_con;2. 初始化和销毁... 阅读全文
posted @ 2014-08-26 21:43 Acjx 阅读(360) 评论(0) 推荐(0)
摘要:引言 先看以下两个信号量: 13)SIGPIPE 当管道读端关闭,再往管道写东西,会发出SIGPIPE信号 17)SIGCHLD 子进程退出会向父进程发出SIGCHLD信号,系统默认处理是忽略掉该信号 代码 /************************************************************************* > File Name: my_fo... 阅读全文
posted @ 2014-08-26 00:13 Acjx 阅读(275) 评论(0) 推荐(0)
摘要:函数原型 NAME signal - ANSI C signal handlingSYNOPSIS #include typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);signal函数具有注册功能,什么事都不干。只是告诉系... 阅读全文
posted @ 2014-08-25 23:29 Acjx 阅读(360) 评论(0) 推荐(0)