ITPub博客

首页 > > > Linux 编程之 Socket

Linux 编程之 Socket

作者:u_453e1a12781dea 时间:2016-12-07 11:23:18 0 删除 编辑

点击上方“蓝字”可以关注我们哦



TCP/IP协议及socket封装



socket编程的基本流程



socket连接的建立(3次握手)




socket连接的断开(3次握手)



由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。


(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。


(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。


(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。


(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。


对应函数接口如图:




socket编程之bind函数


int bind(int sockfd, const struct sockaddr *addr,socklen_t *addrlen);


功能描述:


当用socket()函数创建套接字以后,套接字在名称空间(网络地址族)中存在,但没有任何地址给它赋值。bind()把用addr指定的地址赋值给用文件描述符代表的套接字sockfd。addrlen指定了以addr所指向的地址结构体的字节长度。一般来说,该操作称为“给套接字命名”。


通常,在一个SOCK_STREAM套接字接收连接之前,必须通过bind()函数用本地地址为套接字命名。


备注:

调用bind()函数之后,为socket()函数创建的套接字关联一个相应地址,发送到这个地址的数据可以通过该套接字读取与使用。


备注:
bind()函数并不是总是需要调用的,只有用户进程想与一个具体的地址或端口相关联的时候才需要调用这个函数。如果用户进程没有这个需要,那么程序可以依赖内核的自动的选址机制来完成自动地址选择,而不需要调用bind()函数,同时也避免不必要的复杂度。在一般情况下,对于服务器进程问题需要调用bind()函数,对于客户进程则不需要调用bind()函数。

socket编程之accept函数


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


功能参数描述


accept()系统调用主要用在基于连接的套接字类型,比如SOCK_STREAM和SOCK_SEQPACKET。它提取出所监听套接字的等待连接队列中第一个连接请求,创建一个新的套接字,并返回指向该套接字的文件描述符。新建立的套接字不在监听状态,原来所监听的套接字也不受该系统调用的影响。


备注:
新建立的套接字准备发送send()和接收数据recv()。


参数:

sockfd,    利用系统调用socket()建立的套接字描述符,通过bind()绑定到一个本地地址(一般为服务器的套接字),并且通过listen()一直在监听连接;


服务器代码:


客户端代码:



 我知道一种学习

○

于坚



下载我们APP

Android和IOS均可使用

这里有最新鲜的干货

ITPUB|ChinaUnix|IT168



原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2019-07-17

  • 博文量
    1982
  • 访问量
    17876