网络编程基础

一、网络编程基本知识
1、网络字节序
     内存中的多字节数据对于内存地址有大端小端 之分,磁盘文件中的多字节数据相对于文件中偏移地址也有大端小端之分。网络数据流也有大小端之分。
      大端即数据低位存在高地址,高位存在低地址。
     网络数据流的地址这样规定: 先发出的数据是低地址(故先发送高位),后发出的数据是高地址。收数据从低地址收(先收高位)。
     TCP/IP协议规定,网络数据流用 大端字节序,即低地址高字节。若是小端发送器/接收器,需要把小端转化为大端。
     为使网络程序具有可移植性,使同样的C代码在大小端计算机编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

 例如htonl表示将32位长整数从主机字节转换为网络字节序,例如将IP地址转换后准备发送。若主机是大端字节序,这些函数不做转换,将参数返回;若是小端字节序,则这些函数将参数做相应的大小端转换后返回。
二、socket理解
     在TCP/IP 协议中,IP地址+TCP/UDP端口号标识唯一网络通信中的一个进程,“ IP地址+端口号”称为socket。
     在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接。socket来描述网络连接的一对一关系。
1、socket地址的数据类型
     socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4,IPv6,但是各种网络协议的地址格式都不相同。
sockaddr数据结构

  IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4用sokaddr_in结构体表示,包括16位端口号和32位IP地址。
     各种socket地址结构体开头都是相同的,前16位表示整个结构体长度,后16位表示地址类型。IPv4、IPv6的地址类型分别定义为AF_INET、AF_INET6。只要取得某种sockaddr结构体的首地址,不需要具体是哪种类型sockaddr,就可以根据地址类型字段确认结构体中内容。
     socket API可以接收各种类型sockaddr结构体指针做参数,如bind、accept、connect等函数

其中sockaddr结构体为:

2、基于IPv4的socket网络编程
     sockaddr_in中成员struct in_addr sin_addr表示32位IP地址

3.套接字网络编程

服务端:



启动server,再开启一个终端连接

三、阻塞型的网络编程接口    
1、一问一答的服务器/客户机模型

几乎所有的IO接口都是阻塞型,在调用send()同时,线程将被堵塞,在此期间无法执行任何运算或任何网络请求,所以引入多进程/线程。
2、多线程/多进程的服务器
多线程服务器模型

      输入参数参数sockfd是从socket(),bind(),listen()中沿用下来的socket句柄。执行完bind()和listen()后,操作系统已经开始在指定的端口处监听所有连接请求,若有请求,则将该连接加入请求队列。调用accept()接口就是从socket的请求队列抽取第一个连接信息,创建一个与sockfd同类的新的socket返回句柄。新的socket句柄即是后序read()和recv()的输入参数,若请求队列没有请求,则accept()进入阻塞状态直到有请求进入队列

四、相关函数
1、socket函数
     创建一个能够进行网络通信的套接字。
     第一个参数直定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数设置为AF_INET;
     第二个参数指定要创建的套接字类型,流套接字为SOCK_STREAM,数据报套接字类型为SOCK_DGRAM,原始套接字SOCK_RAW。
     第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议,Internet通信域中,此参数一般取值为0,系统根据套接字;类型决定使用的传输层协议

函数成功返回新创建的套接字描述符,若失败则返回INVALID_SOCKET(Linux下返回-1.)。
*套接字描述符:是一个整数型的值。每个进程的空间里都有一个套接字描述符表。该表中存放着套接字描述符和套接字数据结构的对应关系。表中有一个字段存放新创建的套接字描述符,另一个字段存放套接字数据结构地址,可以根据套接字描述符直接找到对应的套接字数据结构.
2、bind函数
     当socket()创建套接口后,它便存在于一个名字空间(地址族)中,但并未赋名。bind()函数通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑。
     参数列表中第一个参数表已经建立的套接字描述符,第二个参数是指向sockaddr的结构体指针,第三个参数表示addr的长度,用sizeof函数获得。

    其中sockaddr结构体指针指向的结构体为:


     函数成功返回0,失败返回-1.
3、listen()
     创建一个套接字并监听申请的连接。
     其中第一个参数为套接字描述符,第二个参数为等待队列的最大长度。

     为了接受连接,先用socket()创建一个套接口描述字,然后用listen()创建套接口并为申请进入的连接建立一个后备日志,然后就可以用accept()接受连接。listen()仅适用于支持连接的套接口。如SOCK_STREAM类型的。
4.accept()
     函数从sockfd的等待连接队列中抽取第一个连接,创建一个与sockfd同类的新的套接口并返回句柄。
     第一个参数是套接口描述字,该套接口在listen()后监听连接。addr为指针,指向一缓冲区,addrlen可选指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。

     成功返回新的套接字描述符,失败返回-1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值