基于TCP协议的网络客户端和服务端

服务端

tcp_server.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#define BUF_SIZE 1024  // 定义一个宏,用于设置缓冲区大小为1024字节  
  
int main() {  // 主函数入口  
    int iServer, iClient;  // 声明服务器和客户端socket变量  
    struct sockaddr_in stServer, stClient;  // 声明服务器和客户端的地址结构体  
    char buf[BUF_SIZE];  // 声明一个字符数组,用于存储接收到的数据  
  
    // 创建socket  
    iServer = socket(AF_INET, SOCK_STREAM, 0);  // 创建一个IPv4的TCP socket  
    if (iServer == -1) {  // 如果socket创建失败  
        perror("socket error");  // 输出错误信息  
        exit(1);  // 退出程序  
    }  
  
    // 绑定地址和端口  
    memset(&stServer, 0, sizeof(stServer));  // 初始化服务器地址结构体,设置为全0  
    stServer.sin_family = AF_INET;  // 设置地址族为IPv4  
    stServer.sin_addr.s_addr = INADDR_ANY;  // 设置服务器IP地址为任意地址(监听所有网络接口)  
    stServer.sin_port = htons(12345);  // 设置服务器端口为12345,htons函数用于将主机字节序转换为网络字节序  
    if (bind(iServer, (struct sockaddr *)&stServer, sizeof(stServer)) == -1) {  // 绑定socket到地址和端口  
        perror("bind error");  // 如果绑定失败,输出错误信息  
        exit(1);  // 退出程序  
    }  
  
    // 监听连接  
    if (listen(iServer, 5) == -1) {  // 开始监听连接,最大挂起连接数为5  
        perror("listen error");  // 如果监听失败,输出错误信息  
        exit(1);  // 退出程序  
    }  
  
    // 接收客户端连接  
    socklen_t len = sizeof(struct sockaddr_in);  // 声明一个socklen_t变量,用于存储地址结构体的长度  
    iClient = accept(iServer, (struct sockaddr *)&stClient, &len);  // 等待并接受客户端的连接请求  
    if (iClient == -1) {  // 如果接受连接失败  
        perror("accept error");  // 输出错误信息  
        exit(1);  // 退出程序  
    }  
    printf("accept ok! iClient = %d\n", iClient);  // 打印接受的客户端socket的描述符  
  
    // 与客户端进行持续通信  
    while (1) {  // 无限循环,用于持续接收和发送数据  
        memset(buf, 0, BUF_SIZE);  // 清空缓冲区  
        int ret = recv(iClient, buf, BUF_SIZE - 1, 0);  // 从客户端接收数据,注意缓冲区大小减1以留出空间给字符串结束符'\0'  
        if (ret <= 0) {  // 如果接收数据失败或客户端关闭连接  
            if (ret == 0) {  // 如果接收到的数据长度为0,说明客户端正常关闭连接  
                printf("Client closed the connection\n");  // 打印提示信息  
            } else {  // 如果接收失败  
                perror("recv error");  // 输出错误信息  
            }  
            break;  // 跳出循环,结束通信  
        }  
  
        printf("recv data ok! buf = %s\n", buf);  // 打印接收到的数据  
  
        // 回显数据给客户端  
        ret = send(iClient, buf, strlen(buf), 0);  // 将接收到的数据(作为字符串)回显给客户端  
        if (ret <= 0) {  // 如果发送数据失败  
            perror("send error");  // 输出错误信息  
            break;  // 跳出循环,结束通信  
        }  
        printf("send data ok! %s\n", buf);  // 打印发送的数据(注:这里实际上已经打印过了接收的数据,可能只是想表明发送成功)  
    }  
  
    // 关闭客户端连接  
    close(iClient);  // 关闭与客户端的连接  
    printf("Connection with client closed\n");  // 打印连接已关闭的信息  
  
    // 关闭服务器socket(如果需要)  
    close(iServer);  // 关闭服务器socket  
  
    return 0;  // 程序正常结束,返回0  
}

客户端

tcp_client.c

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  
#define BUF_SIZE 1024 // 定义一个宏,用于设置缓冲区大小为1024字节

int main() { // 主函数入口
int iClient; // 声明客户端socket变量
struct sockaddr_in stServer; // 声明服务器地址结构体
char buf[BUF_SIZE]; // 声明一个字符数组,用于存储接收和发送的数据

// 创建socket  
// 创建一个IPv4的TCP socket  
iClient = socket(AF_INET, SOCK_STREAM, 0);    
if (iClient == -1) {  // 如果socket创建失败  
    perror("socket error");  // 输出错误信息  
    exit(1);  // 退出程序  
}  
 
// 设置服务器地址和端口  
// 初始化服务器地址结构体,设置为全0  
memset(&stServer, 0, sizeof(stServer));    
stServer.sin_family = AF_INET;  // 设置地址族为IPv4  
// 假设服务器和客户端在同一台机器上,设置服务器IP地址为127.0.0.1  
stServer.sin_addr.s_addr = inet_addr("127.0.0.1");   
stServer.sin_port = htons(12345);  // 设置服务器端口为12345,htons函数用于将主机字节序转换为网络字节序  
 
// 连接到服务器  
// 尝试连接到服务器  
if (connect(iClient, (struct sockaddr *)&stServer, sizeof(stServer)) == -1) {    
    perror("connect error");  // 如果连接失败,输出错误信息  
    exit(1);  // 退出程序  
}  
printf("connect ok!\n");  // 打印连接成功的消息  
 
// 与服务器进行持续通信  
while (1) {  // 无限循环,用于持续接收和发送数据  
    printf("Enter message to send (or 'quit' to exit): ");  // 提示用户输入要发送的消息或输入'quit'退出  
 
    // 读取用户输入  
    // 从标准输入读取最多BUF_SIZE-1个字符到buf中,并保留一个位置给字符串结束符'\0'  
    fgets(buf, BUF_SIZE - 1, stdin);    
 
    // 移除换行符(如果存在)  
    // 找到换行符并替换为字符串结束符'\0'  
    buf[strcspn(buf, "\n")] = 0;    
 
    // 检查是否输入了'quit'  
    // 如果用户输入的是'quit',则跳出循环  
    if (strcmp(buf, "quit") == 0) {    
        break;    
    }  
 
    // 发送数据到服务器  
    // 将用户输入的数据发送到服务器  
    int ret = send(iClient, buf, strlen(buf), 0);    
    if (ret <= 0) {  // 如果发送数据失败  
        perror("send error");  // 输出错误信息  
        break;  // 跳出循环,结束通信  
    }  
 
    // 接收服务器回显的数据  
    // 清空缓冲区以准备接收新数据  
    memset(buf, 0, BUF_SIZE);    
    // 从服务器接收数据到buf中  
    ret = recv(iClient, buf, BUF_SIZE - 1, 0);    
    if (ret <= 0) {  // 如果接收数据失败或服务器关闭连接  
        if (ret == 0) {  // 如果接收到的数据长度为0,说明服务器正常关闭连接  
            printf("Server closed the connection\n");  // 打印提示信息  
        } else {  // 如果接收失败  
            perror("recv error");  // 输出错误信息  
        }  
        break;  // 跳出循环,结束通信  
    }  
 
    // 打印从服务器接收到的数据  
    printf("Received from server: %s\n", buf);    
}  
 
// 关闭连接  
// 关闭与服务器的连接  
close(iClient);    
printf("Connection with server closed\n");  // 打印连接已关闭的信息  
 
return 0;  // 程序正常结束,返回0
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP/IP是一种通信协议,它包含了客户端服务端两个角色。客户端服务端通过TCP/IP协议进行通信,实现数据的传输和交互。 客户端是指发起连接请求的一方。当客户端需要与服务端进行通信时,它会首先向服务端发起连接请求。客户端在发送请求时,需要提供服务端的地址和口号。一旦连接建立成功,客户端可以通过发送请求报文来向服务端发送数据请求。客户端还可以接收服务端响应的数据,以便进行后续处理。在数据传输结束后,客户端可以选择关闭连接,释放资源。 服务端是指接收并处理连接请求的一方。服务端监听指定的口,并等待客户端的连接请求。当服务端接收到连接请求后,会建立一个与客户端的连接。一旦连接建立,服务端可以接收客户端发送的请求数据,并进行相应的处理。处理完成后,服务端会生成响应数据,并发送给客户端服务端客户端可以通过多次的请求响应交互来进行数据的传输和处理。最后,服务端可以主动关闭连接,释放资源。 TCP/IP客户端服务端之间的通信具有可靠性和顺序性。TCP协议保证了数据传输的可靠性,即在传输过程中不会丢失数据或产生错乱。而IP协议则负责将数据包传输到目标地址。客户端服务端之间的通信是基于可靠的连接进行的,通过TCP协议进行数据传输。数据按照顺序在客户端服务端之间传输,确保了数据的有效性和完整性。 总之,TCP/IP客户端服务端通过可靠的连接和顺序传输实现数据的交互和传输。这种通信方式在互联网上广泛应用,例如浏览器与服务器之间的通信、远程登录等。 ### 回答2: TCP/IP客户端服务端是指在TCP/IP网络中进行通信的两个角色。TCP/IP是互联网所使用的通信协议,它提供了可靠的、无连接的通信。 客户端是指请求并接收服务的一方。客户端通常由应用程序或者用户发起,它向服务器发起请求,并等待服务器的响应。客户端主动与服务器建立连接,并发送请求报文给服务器。在建立连接后,客户端可以将请求数据发送给服务器,并等待服务器的响应。客户端可以是个人电脑、手机、平板电脑等设备,通过应用程序与服务端进行通信。 服务端是指提供服务的一方。服务端运行在服务器上,并等待客户端的连接请求。一旦接收到客户端的请求,服务端会根据请求内容进行相应的处理,并将处理结果返回给客户端服务端可以是网络服务器、数据库服务器、邮件服务器等,它通过应用程序接收和处理客户端请求,并返回相应的结果给客户端TCP/IP客户端服务端之间的通信过程分为三个阶段:建立连接阶段、数据传输阶段和连接关闭阶段。在建立连接阶段,客户端发起连接请求,服务端接受请求并与客户端建立连接。在数据传输阶段,客户端可以将需要发送的数据通过连接发送给服务端服务端接收并处理数据,并将处理结果返回给客户端。在连接关闭阶段,客户端服务端可以选择关闭连接,结束通信。 总之,TCP/IP客户端服务端是互联网通信的两个主要角色,客户端发起请求并接收服务,而服务端接受请求并提供相应的服务。通过TCP/IP协议客户端服务端可以进行可靠的、无连接的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值