socket学习笔记——并发服务器与I/O程序分割客户端
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define BUF_SIZE 30
void error_handling(char* message);
void read_routine(int sock,char* buf);
void write_routine(int sock,char* buf); int main(int argc,char* argv[])
{
int sock;
pid_t pid;
char buf[BUF_SIZE];
struct sockaddr_in serv_addr;
if(argc != )
{
printf("usage: %s <ip><port>\n",argv[]);
exit();
} sock = socket(PF_INET,SOCK_STREAM,);
memset(&serv_addr,,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[]);
serv_addr.sin_port = htons(atoi(argv[])); if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -)
error_handling("connect error"); pid = fork();
if(pid == )
write_routine(sock,buf);
else
read_routine(sock,buf); close(sock);
return ;
} void read_routine(int sock,char* buf)
{
while()
{
int str_len;
str_len = read(sock,buf,BUF_SIZE);
if(str_len == )
return;
buf[str_len] = ;
printf("message from server;%s",buf);
}
} void write_routine(int sock,char* buf)
{
while()
{
fgets(buf,BUF_SIZE,stdin);
if(!strcmp(buf,"q\n") || !strcmp(buf,"Q\n"))
{
shutdown(sock,SHUT_WR);
return;
}
write(sock,buf,strlen(buf));
}
} void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define BUF_SIZE 30
void error_handling(char* message);
void read_childproc(int sig); int main(int argc,char* argv[])
{
int serv_sock,clnt_sock;
struct sockaddr_in serv_addr,clnt_addr;
struct sigaction act;
pid_t pid;
socklen_t adr_sz;
int str_len ,state;
char buf[BUF_SIZE]; if(argc != )
{
printf("usage:%s <port>\n",argv[]);
exit();
} act.sa_handler = read_childproc;
sigemptyset(&act.sa_mask);
act.sa_flags = ;
state = sigaction(SIGCHLD,&act,); serv_sock = socket(AF_INET,SOCK_STREAM,);
memset(&serv_addr,,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[])); if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -)
error_handling("bind error");
if(listen(serv_sock,) == -)
error_handling("listen error"); while()
{
adr_sz = sizeof(clnt_addr);
clnt_sock = accept(serv_sock,(struct sockaddr*)&clnt_addr,&adr_sz);
if(clnt_sock == -)
continue;
else
puts("connecting......"); pid = fork();
if(pid == -)
{
close(clnt_sock);
continue;
}
if(pid == )
{
close(serv_sock);
while((str_len = read(clnt_sock,buf,BUF_SIZE)) != )
write(clnt_sock,buf,str_len); close(clnt_sock);
return ;
}
else
close(clnt_sock);
}
close(serv_sock);
return ;
} void read_childproc(int sig)
{
pid_t pid;
int status;
pid = waitpid(-,&status,WNOHANG);
printf("removed proc id:%d\n",pid);
} void error_handling(char* message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
socket学习笔记——并发服务器与I/O程序分割客户端的更多相关文章
- Git学习笔记(二) · 非典型性程序猿
		
远程库的使用 前面说到的都是git在本地的操作,那么实际协作开发过程中我们肯定是要有一个远程版本库作为项目的核心版本库,也就是投入生产使用的版本.这里我们以 Github为例.Github是一个开放的 ...
 - 《Effective Java》 学习笔记 —— 并发
		
<Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...
 - Java Socket 学习笔记
		
TCP协议的Socket编程 Socket:英文中的意思是插座.两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket.Java中所有关于网络编程的类都 ...
 - C# Socket学习笔记一
		
小记:刚接触网络编程觉得网络是个神奇的东西,所以对它就很有兴趣,想了解下网络是如何进行进行数据传输的,那么开始第一天的学习吧!ReadyGo!!! 首先我们要了解一下几点内容: 1.网络中进程之间如何 ...
 - socket编程和并发服务器
		
socket这个词可以表示很多概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket. 在TCP协议中,建立连接的两个进程 ...
 - 4412开发板学习笔记-NFS服务器的搭建
		
转自iTOP-4412讨论群: http://www.topeetboard.com 先来介绍一下NFS: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件 ...
 - 【视频编解码·学习笔记】11. 提取SPS信息程序
		
一.准备工作: 回到之前SimpleH264Analyzer程序,找到SPS信息,并对其做解析 调整项目目录结构: 修改Global.h文件中代码,添加新数据类型UINT16,之前编写的工程中,UIN ...
 - 【视频编解码·学习笔记】13. 提取PPS信息程序
		
PPS结构解析 与之前解析SPS方式类似 一.定义PPS类: 在3.NAL Unit目录下,新建PicParamSet.cpp和PicParamSet.h,在这两个文件中写入类的定义和函数实现. 类定 ...
 - JZ2440学习笔记之通过J-Link单步裸机程序(Keil+J-Link)
		
我们还是使用JZ2440学习笔记之第一个裸机程序(Keil-MDK)里面的程序,但是把延时拿掉,要不然单步的时候一直在delay里面: int main(void) { // Set GPF4/5/6 ...
 
随机推荐
- php的函数iconv在转"utf-8"到"gb2312"时会自动截断
			
最近在写网站后台时候,需要用到iconv函数把前端jquery Post来过的utf-8编码内容转成gb2312, 发现只有用iconv函数把内容的数据一转码数据就会无缘无故的少了一部分. 问了我 ...
 - 【SQL Server】系统学习之一:表表达式
			
本节讨论的相关内容包括:视图.派生表.CTE.内联表值函数 场景:如果要查询一组数据(例如聚合数据,也就是几个表聚合在一起的数据),这些数据并未在数据库中以表的形式存在. 1.视图:通常用来分解大型的 ...
 - Elastic Search(一)
			
一. 安装插件 Marvel集群管理 root@lj-ThinkPad-L460:~# sudo bin/plugin install license root@lj-ThinkPad-L460:~# ...
 - Spark on Yarn 架构解析
			
. 一.Hadoop Yarn组件介绍: 我们都知道yarn重构根本的思想,是将原有的JobTracker的两个主要功能资源管理器 和 任务调度监控 分离成单独的组件.新的架构使用全局管理所有应用程序 ...
 - PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
			
20150701 Created By BaoXinjian
 - 转载__UI之Frgment
			
http://www.cnblogs.com/plokmju/p/3239265.html 前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示 ...
 - DTD限制XML文件
			
需要通过使用Microsoft Visual Studio 2010.XMLSpy或者eclipse软件来检查校验 文件中有中文,需要存为utf-8编码 book.dtd <!ELEMENT 书 ...
 - DevExpress打印功能 z
			
一.打印功能说明: 打印功能,我们有多种实现方式,可以根据需要自行选择,我简单的总结下两种方法. (1).使用微软.net框架自带的PrintDocument,这种方式是直接借助Graphics,自行 ...
 - UILabel使用技巧
			
UILabel的各种属性与方法的使用(转) #import "LabelTestViewController.h" @implementation LabelTestViewCon ...
 - 将多个网页制作成一个CHM文件
			
有时我们想将一个网站上的多个页面集中保存起来,在即使没有网络的情况下也能够查看. 这时可以将这些网页保存成.mht的单个文件(在IE中打开时,点击 文件 -> 另存) 再使用Easy CHM去将 ...