Linux网络编程客户服务端交流

本文档详细介绍了如何使用C语言编写客户端(client.c)来连接已搭建的服务端(server.c),通过connect函数展示网络编程的基本流程,包括参数理解与实际操作,展示了客户端和服务端之间的通信过程。

我们需要两个程序,server.c和client.c
一个服务端,一个客户端。
服务端我们之前已经搭建好了,可以直接用:
server.c:
在这里插入图片描述在这里插入图片描述

所以我们还需要一个客户端,来看看怎么写的。
客户端的话用到的connect函数,查看手册,
在这里插入图片描述和listen,accept函数的参数都很类似,
我们来直接使用,配合网络编程第一节的整体流程图来看:

client.c:
在这里插入图片描述
同样的,我们连接同一个ip地址端口,并且连接到它,写入我们要写的话,看看交互结果会怎么样?‘

结果
服务端:
在这里插入图片描述客户端:
在这里插入图片描述可以看到,我们实现了客户端和服务端的交流。

(师上官可编程)

### 基于TCP协议的服务器网络编程关键步骤 #### 创建套接字 为了使服务器能够与其他设备通信,首先要创建一个套接字。此操作可以通过调用`socket()`函数来完成,在Linux环境中,该过程涉及指定地址族(如AF_INET)、套接字类型(对于TCP而言通常是SOCK_STREAM),以及协议(通常设为0让系统自动选择)。这一步骤初始化了一个可以用来监听传入连接请求的对象[^4]。 ```c int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); } ``` #### 绑定本地地址 一旦有了套接字对象,就需要将其绑定到特定的IP地址和口号上以便其他程序知道如何找到它。这是通过`bind()`函数实现的;这里需要准备一个结构体 sockaddr_in 来存储IPv4类型的地址信息,并填充必要的字段,比如sin_family、sin_addr 和 sin_port等[^5]。 ```c struct sockaddr_in serv_addr; memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; /* host byte order */ serv_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */ serv_addr.sin_port = htons(PORT); /* short, network byte order */ if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("ERROR on binding"); } ``` #### 开始监听 当成功绑定了地址之后,下一步就是告诉操作系统这个套接字准备好接收来自外部世界的连接尝试了。利用`listen()`方法可以让内核开始排队等待进入的新连接,其中 backlog 参数指明队列的最大长度[^2]。 ```c listen(sockfd, BACKLOG_SIZE); ``` #### 接受新连接 每当有新的客户发起连接请求时,服务器会收到通知并可以从队列中取出这些待处理项。此时应该使用`accept()`函数获取一个新的文件描述符专门用于同那个具体的客户交流。注意这里的 accept() 是阻塞式的,意味着如果没有未决连接的话就会一直等着直到有一个到来为止[^1]。 ```c while(true){ int new_sockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); if(new_sockfd<0){ continue; } // 处理新连接... } ``` #### 数据传输 最后,在建立了有效的连接之后就可以自由地交换消息了。发送数据给对方可以用`send()`,而读取远程主机传来的内容则依赖于`recv()`。这两个动作都是针对先前由 `accept()` 返回的那个特殊的套接字句柄执行的[^3]。 ```c char buffer[BUFFER_SIZE]; bzero(buffer,BUFFER_SIZE); // 发送数据至客户 send(new_sockfd,"Hello Client",strlen("Hello Client"),0); // 接收来自客户的数据 n = recv(new_sockfd,buffer,sizeof(buffer),0); if(n>0){ printf("Received message from client: %s\n",buffer); } close(new_sockfd); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值