首页 > 编程语言 >小目标2:编写一个基本的TCP客户端程序

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

时间:2023-10-05 12:22:50浏览次数:50  
标签:addr buffer TCP server client 客户端程序 编写 客户端 socket

小目标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

相关文章

  • VC++编写ActiveX控件方法
    暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出闸的流程控制程序,里面涉及一个响应用PLC的采集信息的问题(PLC用串口和工控机相连接),然后思考如何用C#写串口通讯程序,结果师兄在一旁直接用VC++写了一个“*.ocx控件”,并在自己的电脑上进行了测试,完工后就把生成的“*.ocx”控......
  • 小目标1:编写一个基本的TCP服务器程序
    小目标1:编写一个基本的TCP服务器程序头文件1#include<cstdio>//C++标准库的头文件2#include<unistd.h>//Unix标准头文件3#include<sys/types.h>//这个头文件定义了各种系统相关的数据类型4#include<sys/socket.h>//这个头文件用于网络编程,包含了与套接字(socket)相关......
  • 实验1 C语言输入输出和简单程序编写
    1.试验任务1  task1.c//打印一个字符小人#include<stdio.h>intmain(){printf("o\n");printf("<H>\n");printf("II\n");return0;} task1_1.c//在垂直方向上打印出两个小人#include<stdio.h>int......
  • 三子棋或多子棋的代码编写
    三子棋或多子棋代码的编写一般是c语言入门的基础练习,而实现这个代码,大致可分为以下几个模块。1.游戏逻辑的测试2.游戏代码的实现3.代码的声明将代码分成几个模块可以更好的管理代码,不至于显得过于臃肿。游戏的逻辑为玩家选择开始游戏,游戏开始运行,此时玩家或电脑选择下棋,当下完5步及......
  • 实验1 C语言输入输出和简单程序编写
    任务1_1源码#include<stdio.h>#include<stdlib.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");printf("O\n");printf("<H>\n");printf(&qu......
  • socket,tcp,http三者之间的区别和原理
    socket,tcp,http三者之间的区别和原理http、TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置:7   应用层   例如HTTP、SMTP、SNMP、FTP、Telnet、SIP、SSH、NFS、RTSP、XMPP、Whois、ENRP6   表示层   例如XDR、ASN.1......
  • 实验1c语言输入输出和简单程序编写
    实验任务11.竖直小人源代码1//打印一个字符小人23#include<stdio.h>4intmain()5{6printf("O\n");7printf("<H>\n");8printf("II\n");9printf("O\n");10printf("<......
  • 实验1 C语言输入输出和简单程序编写
    1.task.1 1#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");78return0;9} task.1_11#include<stdio.h>2intmain()3{......
  • 实验1 C语言输入输出和简单程序编写
    实验任务11.1代码1//打印一个字符小人23#include<stdio.h>4intmain()5{6printf("O\n");7printf("<H>\n");8printf("II\n");9printf("O\n");10printf("<H>......
  • 实验1 C语言输入输出和简单程序编写
    1.实验任务1task1_1.c源代码1#include<stdio.h>2intmain()3{4printf("o\n");5printf("<H>\n");6printf("II\n");7printf("o\n");8printf("<H>\n"......