小目标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得到的结果
服务器端得到的结果
标签:addr,buffer,TCP,server,client,客户端程序,编写,客户端,socket From: https://www.cnblogs.com/CS-liujiajun/p/17743215.html