封裝了乙個套接字sokcet類,內部只儲存乙個套接字檔案描述符m_sockfd
提供了常用的套接字相關的操作,例如:
繫結套接字,監聽,接受乙個連線,關閉寫操作,獲取tcp資訊,
設定套接字為no_delay模式,設定位址重用,埠重用,設定keepalive
private:
//套接字檔案描述符,用const修飾,只能在建構函式初始化列表中初始化,不允許作為左值
const
int m_sockfd;
public:
//explicit禁止隱式轉換
explicit socket(int
sockfd)
:m_sockfd(sockfd){}
~socket();
//獲取m_sockfd
int fd() const
//獲取tcp資訊,利用getsockopt()實現
bool gettcpinfo(struct tcp_info*) const
;
//獲取tcp資訊,儲存到字串buf中
bool gettcpinfostring(char* buf,int len) const
;
//繫結
void bindaddress(const inetaddress&localaddr);
//監聽
void
listen();
//接受乙個連線
int accept(inetaddress*peeraddr);
//關閉寫操作
void
shutdownwrite();
//設定tcp no delay,下面四個都是通過setsockopt()函式設定套接字模式
void settcpnodelay(bool
on);
//位址與埠重用
void setreuseaddr(bool
on);
void setreuseport(bool
on);
//設定keepalive
void setkeepalive(bool on);
#ifndef socket_h#define socket_h#include
"base/noncopyable.h"//
struct tcp_info is in
struct
tcp_info;
namespace
mymuduo
~socket();
//獲取m_sockfd
int fd() const
//獲取tcp資訊,利用getsockopt()實現
bool gettcpinfo(struct tcp_info*) const
;
//獲取tcp資訊,儲存到字串buf中
bool gettcpinfostring(char* buf,int len) const
;
//繫結
void bindaddress(const inetaddress&localaddr);
//監聽
void
listen();
//接受乙個連線
int accept(inetaddress*peeraddr);
//關閉寫操作
void
shutdownwrite();
//設定tcp no delay,下面四個都是通過setsockopt()函式設定套接字模式
void settcpnodelay(bool
on);
//位址與埠重用
void setreuseaddr(bool
on);
void setreuseport(bool
on);
//設定keepalive
void setkeepalive(bool
on);
private
:
//套接字檔案描述符,用const修飾,只能在建構函式初始化列表中初始化,不允許作為左值
const
intm_sockfd;};}
//namespace net}//
namespace mymuduo
#endif
//socket_h
#include "socket.h
"#include
"base/logging.h
"#include
"net/inetaddress.h
"#include
"net/socketsops.h
"#include
in.h>#include
#include
namespace
mymuduo
//獲取tcp資訊,內部使用getsockopt實現,儲存到tcp_info*中
bool socket::gettcpinfo(struct tcp_info* tcpi) const
//同樣是獲取tcp資訊,把tcp資訊儲存到buf中
bool socket::gettcpinfostring(char* buf,int len) const
return
ok;}
//繫結m_sockfd到inetaddress& addr上
void socket::bindaddress(const inetaddress&addr)
//在m_sockfd上監聽操作
void
socket::listen()
//關閉m_sockfd寫操作
void
socket::shutdownwrite()
//在m_sockfd上接受乙個連線,如果成功把客戶機sockaddr儲存到inetaddress* peeraddr中
int socket::accept(inetaddress*peeraddr)
//禁用nigle演算法,設定no delay
void socket::settcpnodelay(bool
on)//
設定ip位址可重用
void socket::setreuseaddr(bool
on)//
設定埠可重用
void socket::setreuseport(bool
on)#endif}//
設定是否開啟keepalive判斷通訊方是否存活
void socket::setkeepalive(bool
on)}
//namespace net}//
namespace mymuduo
還是建立兩個執行緒模擬客戶端和服務端。
#include "base/logging.h
"#include
"base/thread.h
"#include
"net/socket.h
"#include
"net/inetaddress.h
"#include
"net/socketsops.h
"#include
#include
using
namespace
mymuduo::net;
//現在不用直接呼叫socketsops.h中的函式了,直接利用socket和inetaddress這兩個類進行操作就可以了
//為了測試能否正確連線與收發資料,暫時用fcntl把server和client都設定成阻塞模式
//步驟: socket,bing,listen,accpet,read,print tcp info
void
serverthread()
; sockets::read(client,buf,
1024
); std::cout
<<"
recv:
"memset(&buf,0,1024
); server.gettcpinfostring(buf,
1024
); std::cout
<<"
server tcp info: \n
"步驟:socket,connect,write,print tcp info
void
clientthread()
; client.gettcpinfostring(buf,
1024
); std::cout
<<"
client tcp info: \n
"}int
main()
列印資訊:
192.168.1.103:35504 connected in...
client tcp info:
recv: nmsl
server tcp info:
可以看到,能夠建立連線和收發資料,但是socket::gettcpinfo(struct tcp_info*) const呼叫失敗
也就是getsockopt(m_sockfd,sol_tcp,tcp_info,tcpi,&len)呼叫失敗,
沒法獲取tcp_info資料,有點沒搞懂。
muduo原始碼解析之EventLoopThread
回到tcpserver,我們記得裡面有乙個eventloopthreadpool,根據名字,這是乙個執行緒池,它主要用於管理所有的eventloop,每個eventloop對應乙個執行緒。當新連線到來時,acceptor事件分發器將連線分發到合適的執行緒中。執行緒裡面核心是執行eventloop類裡...
muduo原始碼解析1 timestamp類
class timestamp public mymuduo copyable,public boost equality comparable,public boost less than comparable 主要是實現了時間戳的相關操作,例如時間戳的格式化,返回當前時間戳等等。private ...
muduo原始碼解析9 timezone類
class timezone public copyable 感覺有點看不懂,detail內部實現檔案類不明白跟時區有什麼關係.timezone類主要是完成各個時區之間的轉換,感覺自己用不到,乙個時區就夠了.內部成員變數就乙個,是個data結構體的共享智慧型指標 提供了3個建構函式,timezone...