网络协议栈学习(一)socket通信实例
网络协议栈学习(一)socket通信实例
该实例摘自《linux网络编程》(宋敬彬,孙海滨等著)。
例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器;服务器接收到字符串后,发送给服务器;服务器接收到字符串后统计字符串的长度,然后将该值传给客户端;客户端将接收到的信息打印到标准输出。
一、服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h> #define PORT 8888
#define BACKLOG 2
#define LENGTH 1024 void process_conn_server(int s)
{
int size = ;
char buffer[LENGTH]; for(;;){
size = read(s, buffer, LENGTH); if(size == )
return;
sprintf(buffer, "%d bytes altogether\n", size);
write(s, buffer, strlen(buffer)+);
}
}
int main(int argc, char**argv)
{
int ss, sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid; ss = socket(AF_INET, SOCK_STREAM, );
if(ss < ){
printf("socket error\n");
return -;
} bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT); err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(err < ){
printf("bind error\n");
return -;
} err = listen(ss, BACKLOG);
if(err < ){
printf("listen error\n");
return -;
} for(;;){
int addrlen = sizeof(struct sockaddr);
sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
if(sc < )
continue; pid = fork();
if(pid == ){
close(ss);
process_conn_server(sc);
}
else
close(sc);
}
return ;
}
为了方便处理,服务器端在接收到客户端的请求后会fork一个新的进程来处理。函数fork出来的进程集成了父进程的属性,泪如套接字描述符,在子进程和父进程中都各有一套。
为了防止误操作,在父进程中关闭了客户端的套接字描述符,在子进程中关闭了服务器端的套接字描述符。一个进程中套接字的关闭不会造成套接字的真正关闭,只有当所有使用这些套接字的进程都关闭该套接字描述符,linux内核才释放它们。
二、客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h> #define PORT 8888
#define LENGTH 1024 void process_conn_client(int s)
{
int size = ;
char buffer[LENGTH]; for(;;){
size = read(, buffer, LENGTH);
if(size > ){
write(s, buffer, size);
size = read(s, buffer, LENGTH);
write(, buffer, size);
} }
}
int main(int argc, char**argv)
{
int s;
struct sockaddr_in server_addr;
int err; s = socket(AF_INET, SOCK_STREAM, );
if(s < ){
printf("socket error\n");
return -;
} bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT); connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
process_conn_client(s);
close(s);
return ;
}
下面将结合该例子与网络协议栈源码学习如下问题:
1、socket 本质
2、socket 数据发送机制
3、socket 数据接收机制
网络协议栈学习(一)socket通信实例的更多相关文章
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- Flex通信-与Java实现Socket通信实例
Flex通信-与Java实现Socket通信实例 转自:http://blessht.iteye.com/blog/1136888 博客分类: Flex 环境准备 [服务器端] JDK1.6,“ja ...
- Java Socket 通信实例 - 转载
基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些 ...
- (8)Linux(客户端)和Windows(服务端)下socket通信实例
Linux(客户端)和Windows(服务端)下socket通信实例: (1)首先是Windows做客户端,Linux做服务端的程序 Windows Client端 #include <st ...
- 网络协议栈学习(二)创建 socket
下面通过学习linux 1.2.13源码进一步理解socket通信机制.对该版本源码的学习主要参考<Linux内核网络栈源代码情景分析>(曹桂平 编著). 要理解socket的本质,就要理 ...
- 基于Tcp协议的简单Socket通信实例(JAVA)
好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...
- 简单的C# Socket通信实例
一.套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本 ...
- Java Socket通信实例
一.简单的客户端与服务器一对一连接: Socket通信的步骤: 1.创建ServerSocket和Socket 2.打开连接到Scket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关 ...
- Linux网络编程学习(十) ----- Socket(第六章)
前言:由于第五章主要介绍了TCP和UDP协议以及两者的包头的字段以及相应的功能,这里就不介绍了,对着字段看功能就好了,后续开始学习第六章 1.Socket Socket实质上就是提供了通信的端点,每个 ...
随机推荐
- luogu3261 懒惰左偏树 [JLOI2015]城池攻占
目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown ...
- Mysql中unique与primary约束的区别分析(转)
本文章来给大家介绍在mysql中unique与primary约束的区别分析,unique与primary是我们在创建mysql时常用的类型了,下面我来给大家介绍介绍. 定义了UNIQUE约束的字段 ...
- Trailing Zeroes (III) (二分)题解
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ...
- 【环境搭建】CDH版Hadoop环境搭建
1.下载组件 首先去CDH网站上下载hadoop组件 地址:http://archive.cloudera.com/cdh5/cdh/5/ 注意版本号要与其他的组件CDH版本一致 2.环境配置 设置主 ...
- [Shiro] - Shiro之进阶
上一个知识点ssm, 哪里需要权限,哪里写注解@RequirePermission就行. 但是,真正项目开发的时候, 这种方式就很有局限性了, 当权限配置关系发生变化, 每次都要修改代码, 编译打包重 ...
- 关于PATH_INFO
nginx支持PATH_INFO? 想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo? pathinfo不是nginx的功能,pathinfo是ph ...
- Tomcat下载及配置(windows系统)
1.去官网下载 下载安装版的直接安装即可,下载解压版(推荐)的往下看. 2.win键+R键,输入sysdm.cpl点击确定,弹出系统属性窗口,选择菜单栏的高级选项卡,然后点击环境变量. 3.在弹出的窗 ...
- tyvj 2075 [NOIP2012T5]借教室 区间更新+二分
描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样.面对海量租借教室的信息,我们自然希望编 ...
- bcompare Linux版 无限试用
需要root权限. # mv /usr/bin/bcompare /usr/bin/bcompare.real # cat /usr/bin/bcompare #!/bin/sh rm " ...
- MINA2.0用户手册中文版
MINA2.0用户手册中文版--第一章 MINA2.0入门 MINA2.0用户手册中文版--第二章 第一节 MINA应用程序架构 MINA2.0用户手册中文版--第二章 第二节 TCP服务端实例 MI ...