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

被折叠的 条评论
为什么被折叠?



