网络协议栈学习(一)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实质上就是提供了通信的端点,每个 ...
随机推荐
- HttpClient 的使用
HttpClient使用: maven: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient ...
- Git项目创建与提交
创建Git密钥: 1.生成密钥: 右键–>Git Bash Here:先输入ssh-keygen –t rsa –C "邮箱地址",注意ssh-keygen之间是没有空格的, ...
- 51nod 1070 Bash游戏 V4
这种博弈题 都是打表找规律 可我连怎么打表都不会 这个是凑任务的吧....以后等脑子好些了 再琢磨吧 就是斐波那契数列中的数 是必败态 #include<bits/stdc++.h> u ...
- BZOJ5293: [Bjoi2018]求和 树上差分
Description master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k 次方和,而且每次的k 可能是不同的.此处节点深度的定义是这个节点 ...
- C#学习笔记(六):循环嵌套、复杂数据类型和枚举
复杂数据类型 默认情况:0,1,2,3 赋值情况:0,3,4,5://修改初始值,后面都会改变 定义在class外面,作用域更大 定义在class里面(类种类),只能在类里使用 枚举作用:方便把不同角 ...
- HDU 6121 Build a tree(完全K叉树)
http://acm.hdu.edu.cn/showproblem.php?pid=6121 题意:给你一颗完全K叉树,求出每棵子树的节点个数的异或和. 思路: 首先需要了解一些关于完全K叉树或满K叉 ...
- Python time模块详解--转载
1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主要调用C库,所以各个平台可能有所 ...
- dos与unix系统的格式转化
unix 只用\n作为行结束符,而在 dos中是以\r和\n作为行结束符, 如果一个文件是在unix系统下创建,然后想在dos下使用,就要用unix2dos,如 unix2dos file 如果一个文 ...
- c assert 用法
#include <stdio.h> /* printf */ #include <assert.h> /* assert */ void print_number(int* ...
- vscode python3 配置生成任务
一直用sublime,但是ubuntu下输入中文有问题,解决起来太麻烦: pycharm太重.虚拟机一开+Chrome打开10几个页面,然后再运行pycharm,静音轻薄笔记本CPU和8G内存基本都占 ...