muduo原始碼解析21 Socket類

2022-08-23 17:57:14 字數 4726 閱讀 6368

封裝了乙個套接字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...