面向连接的通信和无连接的通信

本文详细介绍了面向连接的通信,包括TCP/IP协议在IP中的实现,服务器端的套接字绑定、监听、接受连接,客户端的连接建立,以及数据的发送与接收。此外,还提到了中断连接时的从容关闭和关闭套接字。接着,文章对比了无连接通信的简单操作流程,主要涉及sendto和recvfrom函数的使用。最后,列举了一些重要的API函数,如getpeername和getsockname等。
摘要由CSDN通过智能技术生成

1.面向连接的通信

在IP中,面向连接的通信时通过TCP/IP协议来实现的。应用程序在使用TCP通信时,需要建立一个虚拟连接。其模型如下:

sd

服务器端

一旦为协议创建了套接字,就要将套接字绑定到一个已知地址上,用bind函数来实现。其定义如下:

int bind(
   SOCKET      s,
   const struct sockaddr FAR *name,
   int namelen
);
  • s:为要连接的套接字。
  • name:其为类型为struct sockaddr。对于TCP协议要用结构体SOCKADDR_IN,要将该结构体转换为该类型。
  • namelen:表示要传递的、由协议决定的地址结构的长度,即第二个参数的长度。

 当将套接字绑定后,就是将套接字置于监听状态,函数为listen。其定义如下:

int listen(
   SOCKET s,
   int    backlog
);
  • s:其为绑定的套接字。
  • backlog:表示等待连接队列的最大长度。当服务器接受了一个连接,就将该连接请求从该队列中删除;当连接请求超过队列长度,就会发回WSAECONNREFUSED错误。

为了接受连接请求,要使用函数accept、WSAAccept或AcceptEx来实现。其中accept函数定义如下:

SOCKET accept(
     SOCKET   s,
     struct sockaddr FAR* addr,
     int FAR* addrlen
);
  • s:为绑定的套接字。
  • addr:为TCP应该是一个有效的SOCKADDR_IN的地址,如果是其他协议就应该是相应的SOCKADDR结构。
  • addr:为SOCKADDR_IN结构体的长度。
  • 返回值:其返回一个新的套接字描述符,其后与客服端的所有操作都应该使用该新的套接字。

通过accept函数,可以讲等待连接队列的第一个请求提供服务。accept返回后,addr会被相应的对方的IP4信息填充。
客户端

客户端创建需要下面3个步骤:

  • 1)创建一个套接字。
  • 2)建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值