学习linux下c++服务器(第二天)

今天建立了一个简易的回声服务器,即输入什么就返回什么

然后再window段写了客户端进行访问

首先是服务器的代码(我写了详细的注释,应该能看懂的)

#include <stdio.h>
#include <string.h> // memset
#include <string>
#include <assert.h>
#include <sys/types.h> // AF_INET , SOCK_STREAM
#include <sys/socket.h> // socket , bind , connect , accept
#include <netinet/in.h> // sockaddr_in
#include <unistd.h>
#include <iostream>
//定义端口号和最大连接数
#define SERVER_PORT 8099
#define LISTEN_Q_lENGTH 10
//嵌套字初始化
int getSocketDone()
{
int ret = socket(AF_INET, SOCK_STREAM, 0);
assert(ret > 0);
std::cout << "socket success" << std::endl;
return ret;

}
//接口初始化,连接嵌套字和接口
int getBindDone(int sock_fd)
{
//接口初始化
struct sockaddr_in serv_addr;
int ret;
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERVER_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//连接嵌套字和接口
ret = bind(sock_fd, (struct sockaddr*)(&serv_addr),
sizeof(struct sockaddr_in));
assert(ret==0);
std::cout << "bind success" << std::endl;
return ret;
}
//监听接口
int getListenDone(int sock_fd)
{
int ret= listen(sock_fd, LISTEN_Q_lENGTH);
assert(ret == 0);
std::cout << "listen success" << std::endl;
return ret;
}
//获取用户标签
int getAcceptDone(int sock_fd_queue, struct sockaddr_in* client_addr,
int* client_len)
{
int sock_fd_conn;

*client_len = sizeof(struct sockaddr_in);
sock_fd_conn = accept(sock_fd_queue, (struct sockaddr*)client_addr,
(socklen_t*)client_len);

assert(sock_fd_conn > 0);
std::cout << "accept success new sockfd_conn :"+ sock_fd_conn << std::endl;
//返回用户标签
return sock_fd_conn;
}
//接收信息
int getRecvMessage(int sock_fd, char* msg, int len)
{ //sock_fd为用户标签,msg为地址,len为读取最大长度,返回值为读到的长度
int ret = recv(sock_fd, msg, len-1, 0);
msg[ret] = '';
assert(ret>0);
//std::cout << "recv success receive " + ret + "bytes" << std::endl;//linux中对cout使用加法会报错
printf("recv success receive %d bytes n", ret);
printf("recv message contents : %sn", msg);
return ret;
}
//发送信息
int setSendMessage(int sock_fd, const char* msg, int len)
{ //sock_fd为用户标签,msg为发送信息,len为长度
int ret = send(sock_fd, msg, strlen(msg), 0);
assert(ret > 0);
std::cout << "send success" << std::endl;
printf("send message contents : %sn", msg);
return ret;
}

int main(int c, char** v)
{
//套接字,服务器接口,客户端接口,接受长度
int sockfd_queue, sockfd_conn, client_len, msg_len;
struct sockaddr_in client_addr;//用户地址
char msg[1024];//存储信息

sockfd_queue = getSocketDone();//嵌套字初始化
getBindDone(sockfd_queue);//接口初始化并和嵌套字绑定
getListenDone(sockfd_queue);//开始监听访问
//不断循环接收信息
while (1)
{
sockfd_conn = getAcceptDone(sockfd_queue, &client_addr, &client_len); //获取用户接口
getRecvMessage(sockfd_conn, msg, sizeof(msg));//获取用户数据
setSendMessage(sockfd_conn, msg, sizeof(msg));//发送数据
close(sockfd_conn);//关闭用户接口
}
return 0;
}

 

然后如果是云服务器的话要去设置端口,不然无法外部访问,具体设置百度有,这里列一个例子:https://jingyan.baidu.com/article/e73e26c075d29124acb6a763.html

然后说一下linux程序运行方法,首先在window上写好代码,然后通过winscp登陆到云系统,然后把写好的c++程序放进去

学习linux下c++服务器(第二天)

 

 然后使用putty登录到云系统

进入刚刚放程序的位置,输入下方语句进行编译

g++ -o MyServes MyServer.cpp

 MyServes 为编译生成文件名,MyServer.cpp为编译文件

然后./MyServes 进行运行

 然后就是这样

学习linux下c++服务器(第二天)

 

 

 

然后输入telnet ip地址加端口号(例子: 121.89.206.57 8099)

结果如下

学习linux下c++服务器(第二天)

 

 

 然后输入信息,例如hello world

 学习linux下c++服务器(第二天)

 

 

 然后服务器段结果如下

学习linux下c++服务器(第二天)

 这样就完成一次通信了

原文链接: https://www.cnblogs.com/jnt-bob/p/12977654.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    学习linux下c++服务器(第二天)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/351269

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:46
下一篇 2023年3月2日 上午6:46

相关推荐