学习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, 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));//发送数据
}
return 0;
}

然后是客户端代码(简单的发送hello world)

#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.lib")
#pragma warning(disable : 4996)
void main()
{
WSADATA wsd;
SOCKET sockClient; //客户端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("start up failed!\n");
return;
}
sockClient = socket(AF_INET, SOCK_STREAM, 0); //创建socket
addrSrv.sin_addr.S_un.S_addr = inet_addr("121.89.206.57");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(8099);
connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //连接服务器端
send(sockClient, "hello world", strlen("hello world") + 1, 0); //向服务器端发送数据
int length=recv(sockClient, recvBuf, 100, 0); //接收服务器端数据
closesocket(sockClient); //关闭连接
WSACleanup();
if (length > 0) {
recvBuf[length] = '\0';
printf(recvBuf);
}
system("pause");
}

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

 然后使用putty登录到云系统

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

g++ -o MyServes MyServer.cpp

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

然后./MyServes 进行运行

 然后就是这样

然后运行客户端

结果如下

 然后服务器段结果如下

 当然因为是一直循环,所以可以继续运行客户端进行访问

猜你喜欢

转载自www.cnblogs.com/jnt-bob/p/12977654.html