muduo 27 项目测试

该代码段展示了C++中实现Socket通信的一些关键函数,包括构造Socket对象、绑定本地地址、监听连接请求、接受新连接以及设置TCP相关选项如TCP_NO_DELAY、SO_REUSEADDR和SO_KEEPALIVE。此外,Makefile用于编译测试服务器,而调试方法包括使用ps命令和netstat命令检查进程及网络状态。

测试代码:

#include "Socket.h"
#include "Logger.h"
#include "InetAddress.h"

#include <unistd.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <strings.h>
#include <netinet/tcp.h>
#include <sys/socket.h>

Socket::Socket(int sockfd)
        : sockfd_(sockfd)
    {}

Socket::~Socket()
{
    close(sockfd_);//调用系统的close 
}

void Socket::bindAddress(const InetAddress &localaddr)
{
    if (0 != ::bind(sockfd_, (sockaddr*)localaddr.getSockAddr(), sizeof(sockaddr_in)))
    {
        LOG_FATAL("bind sockfd:%d fail \n", sockfd_);
    }
}

void Socket::listen()
{
    if (0 != ::listen(sockfd_, 1024))
    {
        LOG_FATAL("listen sockfd:%d fail \n", sockfd_);
    }
}

int Socket::accept(InetAddress *peeraddr)//peeraddr:输出参数
{
    /**
     * 1. accept函数的参数不合法
     * 2. 对返回的connfd没有设置非阻塞
     * Reactor模型 one loop per thread
     * poller + non-blocking IO
     */ 
    sockaddr_in addr;
    socklen_t len = sizeof addr;
    bzero(&addr, sizeof addr);
    //accept4
    int connfd = ::accept4(sockfd_, (sockaddr*)&addr, &len, SOCK_NONBLOCK | SOCK_CLOEXEC);
    if (connfd >= 0)
    {
        peeraddr->setSockAddr(addr);
    }
    return connfd;
}

void Socket::shutdownWrite()//只关闭写端
{
    if (::shutdown(sockfd_, SHUT_WR) < 0)
    {
        LOG_ERROR("shutdownWrite error");
    }
}

void Socket::setTcpNoDelay(bool on)//用于禁用 Nagle 算法通过延迟发送小数据包以减少网络传输的开销,但会增加延迟
{
    int optval = on ? 1 : 0;
    ::setsockopt(sockfd_, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof optval);
}

void Socket::setReuseAddr(bool on)//用于允许地址重用,
{
    int optval = on ? 1 : 0;
    ::setsockopt(sockfd_, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
}

void Socket::setReusePort(bool on)//用于允许端口重用,
{
    int optval = on ? 1 : 0;
    ::setsockopt(sockfd_, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof optval);
}

//通过在空闲状态下定期发送小的TCP包(Keepalive探测包)来检测连接的可用性。如果对端未能及时响应,TCP协议会尝试重新建立连接或关闭连接。
void Socket::setKeepAlive(bool on) //TCP 的 Keepalive 机制 用于保持长时间空闲连接的可用性
{
    int optval = on ? 1 : 0;
    ::setsockopt(sockfd_, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof optval);
}

makefile:

testserver :
	g++ -o testserver testserver.cc -lmymuduo -lpthread -g

clean :
	rm -f testserver

调试:

查看testserver进程是否开启:

ps -ef | grep testserver

 查看TCP服务:

sudo netstat -tanp

 也可以使用GDB调试:(42条消息) 321-重写C++muduo库(测试代码)_liufeng2023的博客-优快云博客

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值