网络编程之socket

一、系统调用与应用编程接口

大多数操作系统使用系统调用(system call)的机制在应用程序和操作系统之间传递控制权

当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口,此接口再把控制权传递给计算机的操作系统,操作系统把这个调用转给某个内部进程,并执行所请求的操作,内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。

系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,又称为应用编程接口(API)。

最著名的是UNIX 操作系统的套接字接口API(socket interface),一般在讨论网络编程时常把套接字作为应用进程和运输层协议之间的接口。

在套接字以上的进程是受应用程序控制的,而在套接字以下的运输层协议软件则是受计算机操作系统的控制。因此,只要应用程序使用TCP/IP协议进行通信,它就必须通过套接字与操作系统交互并请求服务。

二、套接字网络编程socket的基本操作

套接字是通信端点的抽象,应用程序使用套接字描述符访问套接字

1、socket() 函数

(1)参数domain(域)确定通信的特性,包括地址格式。各个域都有自己表示地址的格式,而表示各个域的常数都以AF_开头,意指地址族(address family)。

(2)参数type确定套接字的类型,进一步确定通信特征。

(3)参数Protocol通常为0,表示为给定的域和套接字类型选择默认协议。

  • 在AF_INET(IPv4)通信域中,套接字类型SOCK_STREAM的默认协议是TCP。
  • 在AF_INET(IPv4)通信域中,套接字类型SOCK_DGRAM的默认协议是UDP。

2、寻址

进程标识计算机的网络地址(帮助标识网络上我们想与之通信的计算机)和计算机的端口号(帮助标识特定的进程)组成。

(1)字节序

与同一台计算机的进程通信时,一般不用考虑字节序。

  • 大端字节序:最大字节地址出现在最低有效字节上。
  • 小端字节序:最小字节地址出现在最低有效字节上。

比如32位整数0x04030201,假设有字符指针(cp)强制转换到这个整数地址:

  • 在大端字节序的处理器上,cp[0]指向最高有效字节而包含4,cp[3]指向最低有效字节而包含1.
  • 在小端字节序的处理器上,cp[0]指向最低有效字节而包含1,cp[3]指向最高有效字节而包含4.

注意:TCP/IP协议栈使用大端字节序

3、bind()函数

使用bind()函数来关联地址和套接字,将一个本地协议地址赋予套接口。对于网际协议,协议地址是32位的IPv4或者128位的IPv6地址与16位的TCP或UDP端口号的组合。

参数sockfd:即套接字,通过socket()函数创建,唯一标识一个套接口。

参数addr:指向特定于协议的地址结构的指针;

参数len:指出第二个参数中结构体额长度。

getsockname函数用来发现绑定到套接字上的地址。

如果套接字已经和对等方连接,可以调用getpeername来找到对方的地址

3、connect()函数

如果处理要面向连接的网络服务(SOCK_STREAM和SOCK_SEQPACKET),开始交换数据之前,需使用connect函数建立连接。

在connect中指定的地址是我们想与之通信的服务地址,如果sockfd没有绑定一个地址,connect会给调用者绑定一个默认地址。

4、listen()函数

listen函数仅由TCP服务器调用,它做两件事情:

(1)当socket函数创建一个接口时,它被假设为主动套接口,即它是调用connect发起连接的客户套接口。

listen函数把一个未连接的套接口转换为一个被动套接口,指示应接受指向该套接口的连接请求。调用listen导致套接口从CLOSED转换为LISTEN状态。

(2)listen的第二个参数规定了内核应为相应套接口排队的最大连接个数(包括已完成连接队列和未完成连接队列)。

5、accept()函数

accept函数由TCP服务器调用。

函数accept所返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符与原始套接字(sockfd)有相同的套接字类型和地址族。

如果服务器调用accept,并且当前没有连接请求,服务器会阻塞直到一个请求到来。

6、close()函数

用来关闭套接口,并终止TCP连接。

close操作是使相应套接字的引用计数减1,只有当引用计数为0的时候,才会触发TCP客户端向服务器发送终止连接请求。

7、shutdown()函数

shutdown函数也可以关闭一个socket。

(1)参数sockfd是需要关闭的套接字描述字。

(2)参数how允许shutdown操作选择以下几种方式

  • SHUT_RD:关闭连接的读端,该套接字不再接受数据,任何在套接字接受缓冲区的数据将会被丢弃,但仍可写,但是赢不发送FIN位。
  • SHUT_WR:关闭连接的写端,进程不能再对此套接字发出写操作,但仍可读,对于TCP的套接字(socket),这是半关闭。会发送FIN。
  • SHUT_RDWR:无法读数据也无法写数据。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值