机缘
刚开始仅仅是为了做笔记,文章没有什么亮眼之处,慢慢的,我受到佬的启发开始认真创作,先后更新了数据结构、C++、Linux等专栏
收获
- 获得了几百粉丝的关注
- 获得了阅读量破万的那一天我发了动态
- 认识了需要对后端开发,特别是C++方向的友人
日常
- 创作已经融入生活
成就
提示:你过去写得最好的一段代码是什么? 请用代码块贴出来
#pragma once
#include "logMessage.hpp"
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstring>
#include <unistd.h>
namespace Server
{
enum
{
USAGE_ERR = 1,
SOCKET_ERR,
BIND_ERR,
LISTEN_ERR
};
using namespace std;
static const uint16_t gport = 8080;
static const uint16_t gbacklog = 5;
class tcpServer
{
public:
tcpServer(const uint16_t &port = gport)
: listen_sockfd_(-1), port_(port)
{
}
void InitServer()
{
// 1.创建socket
listen_sockfd_ = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sockfd_ < 0)
{
logMessage(FATAL, "create socket error");
exit(SOCKET_ERR);
}
logMessage(NORMAL, "create socket success");
// 2.bind网络信息
struct sockaddr_in local;
memset(&local,0,sizeof(local));
local.sin_family=AF_INET;
local.sin_port=htons(port_);
local.sin_addr.s_addr=INADDR_ANY;
if(bind(listen_sockfd_,(struct sockaddr*)&local,sizeof(local))<0)
{
logMessage(FATAL,"bind socket error");
exit(BIND_ERR);
}
logMessage(NORMAL,"bind socket success");
//3.设置socket为监听状态
if(listen(listen_sockfd_,gbacklog)<0)
{
logMessage(FATAL,"listen socket error");
exit(LISTEN_ERR);
}
logMessage(NORMAL,"listen socket success");
}
void start()
{
for(; ;)
{
//4.server获取新链接
struct sockaddr_in peer;
socklen_t len=sizeof(peer);
//sock:和客户端通信的文件描述符
int sock=accept(listen_sockfd_,(struct sockaddr*)&peer,&len);
if(sock<0)//没有获取新链接成功就执行下一次循环
{
logMessage(FATAL,"accpect sock error");
continue;
}
logMessage(NORMAL,"accept sock success");
std::cout<<"sock"<<sock<<endl;
//5.通信就用sock文件描述符,面向字节流,后续都是文件操作
/*version1*/
serverIO(sock);
close(sock);
}
}
void serverIO(int sock)
{
char buffer[1024];
while (true)
{
ssize_t n=read(sock,buffer,sizeof(buffer)-1);
if(n>0)
{
buffer[n]=0;
std::cout<<"recv message "<<buffer<<endl;
string outbuffer=buffer;
outbuffer+="server[echo]";
write(sock,outbuffer.c_str(),outbuffer.size());
}
else if(n==0)
{
//客户端退出
logMessage(NORMAL,"client quit ,me too!!");
break;
}
}
}
~tcpServer()
{
}
private:
int listen_sockfd_;//不负责通信,只负责监听链接,获取新链接
uint16_t port_;
};
}
憧憬
未来我将继续创作,在C++方向上创作更优质的文章
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153180.html