【TCP/IP网络编程】(02):基于TCP的客户端/服务端

本文介绍了TCP/IP网络编程中的TCP服务端和客户端实现,包括TCP与UDP的区别、TCP服务端的bind、listen、accept、read/write及close过程,客户端的connect操作,以及回声服务器的示例。还讨论了TCP连接中可能出现的问题及解决方案,如数据一次性读取和数据包丢失,并补充了TCP连接的三次握手和四次挥手原理。
摘要由CSDN通过智能技术生成

TCP服务端/客户端

TCP与UDP

TCP与UDP是传输层常见的网络协议。TCP/IP协议栈如图:
在这里插入图片描述

最底层为数据链路层,往上是IP层,再通过TCP或UDP到达应用层。

链路层负责点到点的传输,而IP层负责端到端的传输。但IP协议是不可靠的协议,数据丢失或者错误的情况无法解决。于是TCP就负责数据传输的可靠性。收到后确认,需要则重传。

应用层

我们所说的socket编程,其实都是发生在应用层的,大部分内容是设计和实现应用层的协议,上面的细节由socket自动处理。

TCP服务端的调用顺序为:

  1. socket()创建套接字
  2. bind()分配IP地址和端口号
  3. listen()等待连接请求
  4. accept()允许连接
  5. read()/write()数据交换
  6. close()断开连接

服务端:等待连接请求

在调用了listen()之后,客户端才可以调用connect()(想要建立连接先要接起电话)

#include <sys/socket.h>
int listen (int sock,int backlog);

第一个参数接收进入等待连接请求状态的套接字文件描述符(可以理解为编号),第二个参数是等待连接队列的长度。

可以理解为listen会生成一个门卫(服务端套接字),并设定等候室的大小,让请求的连接进入等候室。

服务端:允许连接

当有了新的请求时,需要新的套接字来进入这种状态,这时需要accept函数。

#include <sys/socket.h>
int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen)

accept生成一个用于数据I/O的套接字,返回其文件描述符sockfd。第二个参数用于保存客户端地址信息。第三个参数用于保存客户端地址的长度。

简单来说就是从等待队列中取出一个连接请求,创建套接字然后完成连接。

客户端:请求连接

客户端请求连接时调用的是connect函数。

#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *servaddr,socklen_t addrlen);

在服务端接收连接请求后,或者中断连接请求后,connect函数会返回。(接收连接不是accept,是进入到了服务端的请求队列)

服务端没有bind的过程。在调用connect函数时自动分配。

客户端与服务端的关系是:

请添加图片描述

回声服务器

回声的意思就是把服务端将客户端传来的字符数据再原封不动的传回去。

我们之前的模式都是处理完一个客户端请求就退出服务端。如果想要连续服务就需要用循环调用accept。

(如果想要同时服务多个客户端需要学习进程与线程)

我们来看回声服务器的核心代码:

int main(int argc,char* argv[])
{
   
	int serv_sock,clnt_sock;//服务端和客户端的文件描述符
	char message[BUF_SIZE];
	int strlen,i;
	
	
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值