时习之

学而时习之,不亦说乎


  • 首页

  • 标签

  • 归档

  • 搜索

socket API 实现(二)—— bind 函数

发表于 2014-10-24 | 阅读次数:

注:本文基于 2.6.32 版本的内核

概述

上一篇 文章中说明了使用 socket() 函数创建一个 socket 在内核中 的处理流程。再经过一些来到处理之后,返回 socket 的文件描述符。通常应用程序下一步 调用的函数就是 bind() 比如:

1
bind(server_fd, (struct sockaddr*)&server_address, server_len);

那么这一条语句在内核中到处理又是如何呢?我们将在这篇博文中进行分析。和上一篇文章 一样,这篇文章不打算过多的分析代码,而是从总体结构上给出一个较为宏观的图解分析。

阅读全文 »

socket API 实现(一)—— socket 函数

发表于 2014-10-23 | 阅读次数:

注:文中使用到内核版本是 2.6.32.63,其他版本可能会有些许出入

概述

如果我们在应用程序中创建一个 socket,我们一般使用类似下面这样的语句:

1
tcp_scokt = socket(AF_INET, SOCK_STREAM, 0);

那么这条语句在内核的内部到底做了什么呢?这一类到文章和书籍已经非常的多,讲解的也 非常的透彻,所以这篇文章并不想讲解过多的代码,如果你需要了解具体的代码,可以查看 我给出的参考链接[^1][^2]。

阅读全文 »

socket API 实现(零)—— 文件系统注册

发表于 2014-10-22 | 阅读次数:

注:本文中的源码是 2.6.32.63。在 2.6.39 中已经废弃了 get_sb 函数,取而代之的 是 mount 函数,这两函数的原型有些许差别,不过对于本文的主题在逻辑上来说没有太 多的区别。

socket 的概念

接口

socket 的使用非常的广泛,中文一般翻译成“套接字”。那么 socket 到底是什么东西呢? 下面这段话是从 man 7 socket 中摘录下来的:

The BSD compatible sockets are the uniforminterface between the user process and the network protocol stacks in the kernel.

翻译成中文:

和 BSD 兼容的 sockets 是用户进程和内核网络协议栈之间的统一接口。

阅读全文 »

LKD 总结 —— 第二章

发表于 2014-10-09 | 阅读次数:

概述

第二章其实是非常简单的一章,主要讲了以下两个方面的内容:

  • 如何获取源码和编译
  • Linux Kernel 有哪些与众不同的特点

对于第一个问题,个人觉得这本书里面的讲解并不是特别的清晰,我在本文中根据自己摸索 出来的一些经验进行了总结,供大家参考。

阅读全文 »

C 语言的趣味用法

发表于 2014-09-30 | 阅读次数:

零长数组——Zero-Length Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct packet_head {
int len;
char content[0];
};

int main(void)
{
char content[] = "hello world";
struct packet_head *packet;

packet = malloc(sizeof(struct packet_head) + sizeof(content));
packet->len = sizeof(content);

memcpy(packet->content, content, sizeof(content));
printf("len: %d, content: %s\n", packet->len, packet->content);

return 0;
}

在上面这段代码中结构体 packet_head 有一个成员 content 是一个长度为 0 的数组 。这种用法在 C 标准中并不存在,它是 GCC 的一个扩展用法。在编写网络协议实现的时候 用的比较多,在包头的结构体末尾定义一个这样的成员可以使得它指向包头后面的数据部分 。比如在上面的例子中,malloc 分配了包头和数据的空间,把返回值转换成包头类型, 从而使用 packet->content 来控制数据部分。

阅读全文 »

LKD 总结 —— 第一章

发表于 2014-09-18 | 阅读次数:

Unix 的优点

Linux 承袭了大量 Unix 的设计精华主要包括下面这些:

  • 系统接口简单,也就是说系统调用设计的很合理

  • 一切都是文件,这样就可以把数据和设备的访问统一到 open(), read(), write(), lseek(), close() 这组系统调用中

  • 使用 C 语言编写,有非常好的可移植性(这个应该是相对与汇编语言来说吧)

  • 快速的进程创建(fork)

  • 简单而稳定的进程间通信机制(IPC)

阅读全文 »

Emacs C、C++、Python 编程的简单配置

发表于 2014-09-16 | 阅读次数:

简介

Emacs 和 Vim 并称 Linux 下的两大编辑神器(不是 IDE,只是编辑器)。一般人认为这两 个编辑器的门槛太高,不容易学,使得很多人都只能敬仰却没有勇气使用它们。其实个人并 不认同这样的看法,Emacs 和 Vim 基本的操作其实并不复杂,而且它们各自都带有非常好 的入门教程。Emacs 在启动页面上会有一个非常通俗易懂的教程(tutorial),如果你关闭 的启动页面,你可以在菜单栏的 Help 下找到这个教程,如果你关闭的菜单栏可以使用 M-x (也就是 Alt + x)执行命令 menu-bar-mode 显示菜单栏。个人觉得这份教程对于初学者 的价值比任何其他资料都更高,如果你没有使用过 Emacs 或者说你还不是很熟悉它的话, 建议你先阅读这份文档。

阅读全文 »

Linux 中断、抢占、锁之间的关系

发表于 2014-09-06 | 阅读次数:

抢占(preempt)

现代操作系统为了提高资源的利用率一般都支持多任务(这里不想纠结进程、线程、内核线 程之间的关系所以使用任务一词),但是因为系统资源有限,系统中同一时间点能够运行的 任务是有限的(单核的话只有一个,多核可能有多个)。为了解决这个冲突,操作系统不得 不在任务之间不断的切换,让一些任务运行一段时间之后睡眠,然后从原来处于睡眠状态的 任务中选出一些来继续运行。这种从一个运行的任务切换到另一个运行的任务的行为叫做任 务切换,而任务切换是通过调度来完成的。

阅读全文 »
1…1011
郭荣飞

郭荣飞

记录成长路上的点点滴滴

108 日志
33 标签
© 2018 郭荣飞
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4