小目标2:编写一个基本的TCP客户端程序

发布时间 2023-10-05 12:11:36作者: †CS.Renascence

小目标2:编写一个基本的TCP客户端程序

头文件

 #include<cstdio>//C语言标准库
 #include<unistd.h>//Unix标准库
 #include<arpa/inet.h>//包含了与网络编程相关的函数和结构体的声明。它定义了用于IP地址和端口转换的函数
 #include<string.h>//字符串操作的库,后面有用到memset函数需要这个

 

第一步:创建套接字

 int client_socket;//声明客户端的套接字描述符
 char buffer[50] = { 0 };//创建缓冲区,后面会用到
 client_socket = socket(AF_INET, SOCK_STREAM, 0);//创建套接字
 if (client_socket < 0) {//如果创建失败则输出报错的原因
     perror("client socket failed:");
     return 0;
 }

第二步:要告诉这个客户端我们的IP地址和端口号(连接前的初始化设置)

struct sockaddr_in server_addr;// server_addr,用于存储套接字的地址信息。
 server_addr.sin_family = AF_INET;//AF_INET 表示IPv4地址族
 server_addr.sin_addr.s_addr = inet_addr("192.168.43.128");//这里填Ubantu虚拟机的网卡IP地址,如果服务器和客户端在同一台机子上,则IP地址可以写成127.0.0.1
 server_addr.sin_port = htons(6666);//端口号赋值

第三步:调用connect函数把客户端套接字连接到服务器

connect函数的参数解析:

client_socket: 这是客户端套接字,表示与服务器建立连接的套接字。

(struct sockaddr*)&server_addr: 这是一个将服务器地址结构体 server_addr 转换为 struct sockaddr* 类型的指针(connect 函数需要一个指向目标服务器地址的指针)

sizeof(server_addr): 这是服务器地址结构体 server_addr 的大小

连接成功返回0

if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0 ){
     perror("connect error!");
     return 0;
 }
 printf("客户端连接服务器成功!\n");

第五步:客户端和服务器的信息交互

我们用户在客户端终端连续输入字符串,回车表示把数据发送出去

解释:

fgets 函数用于从文件流中读取一行数据,它的参数是:

  • buffer:用于存储读取数据的字符数组。

  • sizeof(buffer):指定要读取的最大字符数。

  • stdin:标准输入文件流。

直到 fgets 函数返回 NULL,表示已经到达输入流的末尾或发生了错误。

 

write 函数将从标准输入(用户从终端输入的数据)放到buffer里面,然后写入到 client_socket 表示的套接字中。

【PS:当你调用 write 函数写入数据到 client_socket 时,数据被复制到客户端套接字的发送缓冲区中。然后,操作系统负责将发送缓冲区中的数据通过网络传输到服务器。所以服务器可以接收到,read同理】

 

read 函数从 client_socket 表示的套接字中读取服务器的响应数据,然后读到buffer里面,返回实际的字节数res

int res=0;//实际write/read函数返回的数据的字节数(下面有用到)
  //while 循环会不断从标准输入(用户在终端中输入的内容)读取数据然后存储到buffer
 while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
    
     //把键盘输入到终端的数据写到client_socket中,操作系统发送给服务器
     res = write(client_socket, buffer, sizeof(buffer));
     printf("send bytes=%d\n", res);
     memset(buffer, 0, sizeof(buffer));//清空缓冲区
     //这一行代码使用 read 函数从 client_socket 表示的套接字中读取服务器的响应数据,并将数据存储在 buffer 中。
     res = read(client_socket, buffer, sizeof(buffer));
     printf("recv from server info:%s\n", buffer);
     memset(buffer, 0, sizeof(buffer));
 }

 

运行方式和运行结果

运行方式

我这里采用Xshell的方式来运行程序:

补充内容:Xshell的使用方式:挖一个坑,后续补上

服务器端定位到:

linux_server_version1是我visual studio的文件名

 ~/projects/linux_server_version1/bin/x64/Debug$ 

服务器端运行代码

 ./linux_server_version1.out

然后

客户端定位到:

linux_client_version1是我visual studio的文件名

 ~/projects/linux_client_version1/bin/x64/Debug$

客户端再执行代码

./linux_client_version1.out
运行结果

客户端输入hello 和 helloworld得到的结果

服务器端得到的结果