套接口地址结构

IPv4的套接口地址结构为:

struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_family;
struct in_addr sin_addr;
char sin_zero[8];
};

其中最重要的部分当属sin_addr结构体。这个结构体只有一个元素就是类型为in_addr_t的32bit的IPv4地址。

struct in_addr
{
in_addr_t s_addr;
};

因此假设有一个地址结构addr,要取得地址,addr.in_addr得到的是一个in_addr类型的结构体;addr.in_addr.s_addr取得的是一in_addr_t 的地址(通常是32位的整数)。

套接口地址结构在传递给套接口函数的时候,总是以指针的方式传递。当函数支持不同类型协议时,如何声明函数参数类型使得通用呢?在ANSI C的无类型指针void *出现之前就解决了这个问题。定义了一个标准的通用套接口地址结构:

struct sockaddr
{
uint8_t sin_len;
sa_family_t sa_family;
char sa_data[14];
};

用户在使用一些用通用结构类型作为参数的时候必须进行强制类型转换(struct sockaddr *),否则编译器在检查参数时会给出警告。而内核在处理函数传入的参数时,通过sockaddr中的sa_family来确定传入结构的具体类型。

 

值-结果参数

首先要搞清楚为何在socket编程中,结果参数有两个传递方向:从进程到内核和从内核到进程。我们通常见到的bind,connect,sendto,accept,recvfrom等函数都是系统调用,系统调用时内核提供的函数,也是用户程序和内核之间的接口。用户程序在使用系统调用的时候,通常会采用软中断的方式陷入到内核中再通过系统调用实现函数的功能。

从进程到内核传递套接口地址结构的函数有bind,connect和sendto.用户程序在调用这些函数的时候,将函数的参数传递给内核处理,用户调用这些函数要拷贝多少数据量当然是知道的(换句话说,用户要求内核拷贝多少数据量肯定是知道的),因此函数传递的参数是结构的具体大小。如connect所示:

struct sockaddr_in serv;
connect(sockfd,( struct sockaddr * ) &serv, sizof(serv))

而当函数如accept、recvfrom等在调用时,内核需要向进程返回处理结果,函数调用时传入的参数是指向结构大小的指针,这个值仅仅是为了防止内核越界,在执行完成之后,内核将返回储存的大小,因此在传入是一个值,函数执行完成之后,将实际的值写入返回时修改指针指向的大小作为返回值,这时是结果。

 

不可重入函数

本节不止一次提到一个概念:函数不可重入。到底怎样才算可重入函数呢?

可重入,顾名思义就是可以重复进入。可以重复进入意味着函数可以被不同的进程调用,并且数据不会出现问题。或者换个说法,可重入的函数可以在任何时候被中断去执行另外一个任务而不会出现问题。因此在写可重入函数时,要保证几点:

  • 最好不要使用全局变量。如果非要使用,必须用锁或者信号量对变量进行保护。
  • 不使用静态变量。
  • 不调用不可重入函数。
  • 保证中断的安全。

不可重入函数基本有下面几类:

  • 函数体内使用了静态的数据结构。
  • 函数体内使用了全局变量。
  • 函数体内调用了malloc()或者free()函数。
  • 函数体内调用了标准I/O函数。标准io库很多实现都以不可重入的方式使用全局数据结构。
  • 进行了浮点运算.许多的处理器/编译器中,浮点一般都是不可重入的。

Unix网络编程(1)——socket一窥的更多相关文章

  1. Unix网络编程 之 socket基础

    基本结构 (这部分的地址均为网络地址<网络字节序>) 1.struct sockaddr:通用套接字地址结构 此结构用于存储通用套接字地址. 数据结构定义: typedef unsigne ...

  2. UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...

  3. 【Linux/unix网络编程】之使用socket进行TCP编程

    实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...

  4. UNIX网络编程——getsockname和getpeername函数

    UNIX网络编程--getsockname和getpeername函数   来源:网络转载   http://www.educity.cn/linux/1241293.html     这两个函数或者 ...

  5. 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

    RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...

  6. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  7. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  8. Unix网络编程--卷一:套接字联网API

    UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 0.准备环境 1.简介 2.传输层:TCP.UD ...

  9. UNIX网络编程

    UNIX网络编程--socket的keep http://www.68idc.cn/help/opersys/unixbsd/20150731471448.html

随机推荐

  1. 《深入Java虚拟机学习笔记》- 第18章 finally子句

    本章主要介绍字节码实现的finally子句.包括相关指令以及这些指令的使用方式.此外,本章还介绍了Java源代码中finally子句所展示的一些令人惊讶的特性,并从字节码角度对这些特征进行了解释. 1 ...

  2. HDU 1560 DNA sequence DFS

    题意:找到一个最短的串,使得所有给出的串是它的子序列,输出最短的串的长度,然后发现这个串最长是40 分析:从所给串的最长长度开始枚举,然后对于每个长度,暴力深搜,枚举当前位是哪一个字母,注意剪枝 注: ...

  3. android和ios的系统特性区别

    1.  删除:android是长按,ios为滑动/或者进入编辑模式 2.  android:应用内返回键,保证用户停留在应用程序中:硬件返回键可以让用户退出应用程序 3.  剪切/粘贴/选择等文本操作 ...

  4. Linux批量修改指定目录下的文件或文件夹权限

    在Puppet下很头大,尤其是文件拷贝,使用file的mode会导致文件或文件夹都一个权限. 暂时使用命令代替: 最近忙着明年的N多计划,待有空后继续研究.

  5. SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]

    //SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式] //应用产品: SMG12232ZK标准中文字符点阵型液晶显示模块 // 本演示程序适用于SM ...

  6. Leetcode OJ : Restore IP Addresses backtrack暴搜 C++ solution

    class Solution { public: vector<string> ret; string src; int len; unordered_set<string> ...

  7. Obective-C之宏定义

    优(dan)美(teng)的前奏 宏定义这个东东,估计大家在代码中应该天天用吧. 在我刚刚做的一个项目中,各种往代码里码“#define”这种预处理指令. 什么动画时长啊,cell高度啊,cell的个 ...

  8. 国外程序员整理的Java资源

    好资料,慢慢学习.http://www.importnew.com/14429.html 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理, ...

  9. Spring配置文件的加载,及装载多个beans.xml文件

    applicationContext.xml 是spring的全局配置文件,用来控制srping的特性 1  手动加载自定义的beans.xml文件 @Test public void testAut ...

  10. AndroidManifest笔记

    1.android:configChanges如果配置了这个值,比如"orientation",在屏幕旋转时会调用Activity的onConfigurationChanged,而 ...