学习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] = '\0';
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 : %s\n", 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 : %s\n", 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++程序放进去

 

 然后使用putty登录到云系统

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

g++ -o MyServes MyServer.cpp

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

然后./MyServes 进行运行

 然后就是这样

 

 

 

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

结果如下

 

 

 然后输入信息,例如hello world

 

 

 

 然后服务器段结果如下

 这样就完成一次通信了

posted @ 2020-05-28 00:11  深水bob  阅读(476)  评论(0)    收藏  举报