代码拉取完成,页面将自动刷新
//Tcp回显服务器项目——客户端(不实现类,直接使用相关套接字接口)
#include <iostream>
#include <cstring>
#include <unistd.h> //提供文件读写、进程控制等函数
#include <sys/types.h> //定义数据类型(如size_t, ssize_t),通常被其他网络头文件隐式包含
#include <sys/socket.h> //提供套接字操作的核心函数(如socket(), bind(), listen(), accept(), connect())和数据结构(如sockaddr)。
#include <netinet/in.h> //定义IPv4和IPv6地址结构体(如sockaddr_in, sockaddr_in6)和网络字节序转换宏(如htonl(), htons())
#include <arpa/inet.h> //提供IP地址转换函数(如inet_pton(), inet_ntop())
//启动客户端指令: ./tcpclient server-ip server-port
int main(int argc, char *argv[])
{
if(argc!=3)
{
std::cerr<<"Usage: "<<argv[0]<<" server-ip server-port"<<std::endl;//客户端启动指令错误
exit(0);
}
std::string serverip=argv[1];//从main函数参数中获取服务端ip地址
uint16_t serverport=std::stoi(argv[2]);//从main函数参数中获取服务端端口号
//1.创建套接字
int sockfd=::socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)//创建失败
{
std::cerr<<"create socket error"<<std::endl;
exit(1);
}
//补充:客户端不需要显式绑定套接字,客户端拥有自己的ip地址和端口号
//当客户端与服务端连接成功时,操作系统会自动为客户端的套接字绑定上ip地址和端口号
//2.与服务端建立连接
struct sockaddr_in server;
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;// 指定套接字的通信协议类型为IPv4
server.sin_port=htons(serverport);// 指定通信端口号(网络字节序)
::inet_pton(AF_INET,serverip.c_str(),&server.sin_addr);//将点分十进制形式的ip地址转换为struct in_addr类型
int n=::connect(sockfd,(struct sockaddr*)&server,sizeof(server));//连接服务端
if(n<0)//连接失败
{
std::cerr<<"connect socket error"<<std::endl;
exit(2);
}
//长服务
while(true)//连接成功
{
std::string message;
std::cout<<"Enter #";
std::getline(std::cin,message);//客户端输入消息
write(sockfd,message.c_str(),message.size());//客户端给服务端发送消息
char echo_buffer[1024];
n=read(sockfd,echo_buffer,sizeof(echo_buffer));//客户端接收服务端的消息,并存放在echo_buffer中
if(n>0)
{
echo_buffer[n]=0;
std::cout<<echo_buffer<<std::endl;//客户端输出从服务端的获取到的消息
}
else
{
break;
}
}
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。