网络连接无外乎服务器和客户端两方面的编程。

对于服务器大致的流程是:1---调用socket函数创建套接字

            2---调用bind函数分配IP地址和端口号

            3---调用listsen函数将套接字转为可接受请求状态

            4---调用accept函数受理链接请求

以上四个函数的使用,需要包含头文件   --- #include <sys/socket.h>

完成以上四个步骤,一个完整的能够基础服务器就搭建好了,只需要等待客户端的链接,下面分析一下整个过程中用到的几个函数。

Int socket(int domain,int type,int protocol)

创建网络套接字,成功时返回文件描述符(一个int型的数),失败时返回-1。

什么是网络套接字?----这个不需要关心,其实就是一个打包好的结构。是网络上两个程序双向通讯连接的端点。

A network socket is an endpoint of an inter-process communication across a computer network. Today, most communication between computers is based on the Internet Protocol; therefore most network sockets are Internet sockets.

参数说明:

domain  ----协议族,套接字通信中协议的具体分类。主要用到的有以下几个:

    PF_INET          IPv4互联网协议族

    PF_INET6          IPv6互联网协议族

    PF_LOCAL          本地通信的UNIX协议族

    PF_PACKET          底层套接字的协议族

    PF_IPX             IPX Novell协议族

type   ----套接字类型常用参数有以下:

    SOCK_STREAM  面向连接的套接字。可靠的,按序传递的,基于字节面向连接的套接字。特点:

    1---传输过程中数据不会消失;(拥有独立的内部缓冲区)

    2--按序传输数据;(拥有独立的内部缓冲区)

    3--传输的数据不存在数据边界。(拥有缓冲区,数据可以一次读出也可以分多次读出)

    SOCK_DGRAM  面向消息的套接字。不可靠的,不按序传递的,以字节高速传输的套接字特点:

    1 ---强调快速传输而非传输顺序;

    2---传输的数据可能丢失也可能损毁;

    3---传输的数据有数据边界;

    4---限制每次传输的数据大小。

protocol  ---决定最终采用的协议。大部分情况传递0,除非同一协议族中存在多个数据传输方式相同的协议(有有待理解)

    常用协议有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC等,分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。type和protocol不可以随意组合,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当第三个参数为0时,会自动选择第二个参数类型对应的默认协议。

Int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);

绑定套接字,给我们创建的套接字分配IP地址和端口号。成功时返回0,失败时返回-1.

参数说明:

sockfd  ---套接字描述符(创建套接字时有产生)

套接字的描述符,一般是定义一个int型的变量,然后作为这个参数,好处就是不要记复杂的数字,我们可以给他一个自己熟悉的名字,以后使用到这个套接字的时候更方便操作。

myaddr  ---sockaddr结构体指针,其中包含了要绑定的地址和端口号。

struct sockaddr {
  unsigned short sa_family; /* address family, AF_xxx */
  char sa_data[14]; /* 14 bytes of protocol address */
 }; 

sa_family :是2字节的地址家族,一般都是“AF_xxx”的形式,它的值包括三种:AF_INET,AF_INET6和AF_UNSPEC。
如果指定AF_INET,那么函数就不能返回任何IPV6相关的地址信息;如果仅指定了AF_INET6,则就不能返回任何IPV4地址信息。
AF_UNSPEC则意味着函数返回的是适用于指定主机名和服务名且适合任何协议族的地址。如果某个主机既有AAAA记录(IPV6)地址,同时又有A记录(IPV4)地址,那么AAAA记录将作为sockaddr_in6结构返回,而A记录则作为sockaddr_in结构返回。
通常用的都是AF_INET。
在通常情况下我们都是使用另一个结构体sockaddr_in来指定绑定的信息,然后再将它强转成sockaddr指针。
struct sockaddr_in {
  short int sin_family; /* Address family */
  unsigned short int sin_port; /* Port number */
  struct in_addr sin_addr; /* Internet address */
  unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
  sin_family:指代协议族,在socket编程中只能是AF_INET
  sin_port:存储端口号(使用网络字节顺序)
  sin_addr:存储IP地址,使用in_addr这个数据结构
  sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
而其中in_addr结构的定义如下:
typedef struct in_addr {
  union {
  struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
  struct{ unsigned short s_w1, s_w2;} S_un_w;
  unsigned long S_addr;
  } S_un;
  } IN_ADDR;
阐述下in_addr的含义,很显然它是一个存储ip地址的共用体有三种表达方式:
第一种用四个字节来表示IP地址的四个数字;
第二种用两个双字节来表示IP地址;
第三种用一个长整型来表示IP地址。
addrlen  ---myaddr结构体的具体长度,通常使用 sizeof(myaddr)获得。
 

Int listen(int sockfd, int backlog)

将套接字转化成可接受状态。可以接受来自客户端的信号

参数说明:

sockfd  ---用于标识一个已捆绑未连接套接口的描述字。
backlog  ---等待连接队列的最大长度。

Int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)

阻塞式等待链接,失败时返回-1.

参数说明:  ---参考bind的说明,注意此处的addrlen是一个指针!!!!!!!!!!!!!!!!

Linux 网络编程 入门-常用函数的更多相关文章

  1. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  2. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  3. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  4. Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. 【Linux 网络编程】常用TCP/IP网络编程函数

    (1)函数socket /**************************************************************** ** 功能:创建一个套接字用于通信 ** 参 ...

  6. linux网络编程:splice函数和tee( )函数高效的零拷贝

    splice( )函数 在两个文件描述符之间移动数据,同sendfile( )函数一样,也是零拷贝. 函数原型: #include <fcntl.h> ssize_t splice(int ...

  7. Linux网络编程2——系统函数

    socket信息数据结构 #include <netinet/in.h> struct sockaddr { unsigned short sa_family; /*地址族*/ ]; /* ...

  8. linux网络编程涉及的函数

    常用的网络命令: netstat 命令netstat是用来显示网络的连接,路由表和接口统计等网络的信息. netstat有许多的选项我们常用的选项是-an用来显示详细的网络状态.至于其它选项我们使用帮 ...

  9. linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复 ...

随机推荐

  1. 页面跳转、URL直接访问限制

    问题 URL控制是为了避免以下错误 当前页需要读取上一页缓存,但是当前页直接通过URL访问无法获得相应的缓存 当前页需要通过入口,清楚历史中保留的缓存,但是当前页直接通过URL访问没有清除 本质上是为 ...

  2. 18Linux-LNMP-Linux就该这么学

    LNMP 编译环境包: [root@linuxprobe ~]# yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cp ...

  3. 40_redux_counter应用_redux完善版本

    项目结构: 代码: import React from 'react'; import ReactDOM from 'react-dom'; import store from './redux/st ...

  4. jsTree通过AJAX从后台获取数据

    页面代码: <div id="MenuTree"></div> javascript代码: $(document).ready(function ($) { ...

  5. numpy-matrix 方法速查

    ->matrix.T transpose:返回矩阵的转置矩阵 matrix.H hermitian (conjugate) transpose:返回复数矩阵的共轭元素矩阵 matrix.I in ...

  6. Java环境变量PATH和CLASSPATH

    Java开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH. 1.PATH环境变量 1.1 作用简介 安装完JDK(Java Development ...

  7. SQL游标在递归是的时候提示 "游标" 名称已经存在的问题

    游标的语法: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | D ...

  8. JVM、redis缓存适用场景

    1. 数据状态相对稳定:(针对数据本身)数据修改较少. 2. 输出的数据是相对幂等:(针对业务)多次查询期间,数据不变动.如果查询频率过高,缓存可能没有及时更新. 了解一下redis.ehcache. ...

  9. 吴裕雄 python 机器学习——ElasticNet回归

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  10. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...