重構,我的CSTSocket類,NO MFC。

2021-04-01 17:01:00 字數 2679 閱讀 1473

是不是一直在尋找socket這樣的功能,所有的,對我是說所有的,都是在限定的時間範圍返回結果。socket i/o模型中select模型提供了這樣的可能,當然一些超時還要經過一些技巧才行。這是我重構的自己完全動手的第2個可重用類。由於加了#define time_infinite 0xffffffff //阻塞模式哈,我第乙個包裝了的類cbtsocket類可以丟到水桶裡去,我可憐的bt~我會記得你的,沒有你怎麼有我的st了。

首先是套接字的create哈,create就不用超時了吧根本沒這個必要了,因為他馬上就返回的

然後listen看來也沒必要,也是直接返的,bind看來也沒必要了。接下來有用武之地了。首先是connect超時,這個vckbase的精華區有篇文章,取其精華copy過來實現之哈哈變成了以下方式

int cstsocket::connect(const char* szip, unsigned short nport, int nsec, int nusec)

if(m_ssocket == null)

return ret_errsocket;

if( strlen(szip) == 0 || nport == 0 )

return ret_badparam;

m_addr.sin_addr.s_addr = inet_addr(szip);

if(inaddr_none == m_addr.sin_addr.s_addr)

m_addr.sin_family = af_inet;

m_addr.sin_port = htons( nport );

if(nsec == time_infinite)

}else

fd_set fd = ;

timeval tv = ;

connect(m_ssocket,(sockaddr*)&m_addr, sizeof(m_addr));

nret = select(0, 0, &fd, 0, &tv); 

if(nret == socket_error)

if(nret == 0)  

//設回阻塞模式

ul = 0 ;

nret = ioctlsocket(m_ssocket, fionbio, (unsigned long*)&ul);

if(nret == socket_error)

}return ret_success;

接下來是accept,這個好象多此一舉,不過自然能實現我就實現吧,閒著也是閒著

int cstsocket::accept(cstsocket &sock, int nsec, int nusec)

;timeval tv = ;

int nret;

//阻塞模式

if(nsec != time_infinite)

if(nret == 0)  }

if((s = accept(m_ssocket, (sockaddr*)&addr, &naddrsize)) == invalid_socket )

sock.setcontent(s, addr);

return ret_success;

開始在網上找時候並沒有找到相關的,但看到sdk

readfds:if listening, a connection is pending, accept will succeed

於是我如上事項,也成功了。

接下來是傳送,因為有個緩衝區可以輪刷~

int cstsocket::send(const char *szdata, int nlen, int nsec, int nusec)

if(nsent == 0)

nleft -= nsent;

nidx  += nsent;}}

else

;timeval tv = ;

while(nleft > 0)

if(nret == 0)

nsent = send(m_ssocket, szdata + nidx, nleft, 0);

if(nsent == socket_error)

if(nsent == 0)

nleft -= nsent;

nidx  += nsent;

}return ret_success;

接下來接受,一次接受,

int cstsocket::recv(char *szdata, int nlen, int *pnrecvlen, int nsec, int nusec)

;timeval tv = ;

nret = select(0, &fd, null, null, &tv);

if (socket_error == nret)

if(nret == 0)

*pnrecvlen = recv(m_ssocket, szdata, nlen, 0);

if (*pnrecvlen == socket_error)

if (0 == *pnrecvlen)

return ret_success;

}最後加了個函式,接受固定子節數的,如果接受不到,最後會超時。

.lwkl.net/select模型socket.rar

經過測試寫了個簡單的伺服器和客戶機

謝謝大家捧場希望大家喜歡,有錯誤請告知。

寫完這個類,測試成功後,我又找到了久違的快感~哈~~~~~~~~~~~`

重構 過大的類

在物件導向的設計程式中,有個 單一職責 原則,也就是說,這個類的功能比較單一,只做一件事情,而且引起這個類物件變化也是唯一的。說白了就是乙個類只幹一件事情,而且引起這個發生變化的介面也只有乙個。如果判斷乙個類是過大呢?乙個簡單的辦法就是 這個類中的變數太多了,而且這些變數的含義功能優勢多方面的。出現...

類之間的重構

類之間的重構操作 主要的內容就是分解龐大的類,合併不負責任的類,在類間搬移值域和函式。1 movemethod 你的程式中,有個函式與其所在的類意外的另乙個類進行更多的交流,呼叫後者,或者背後者呼叫,說明這個函式可能不適合在這個類裡面,適當的時候移動到適當的類裡面。減少類之間的高度耦合。讓類乾淨利索...

我理解的重構 c

今天看到一篇應用介面的文章,主要是如何利用.net內建的功能,來重構 覺得有點意思,摘錄其中的 下來,以備將來參考。但是我與這篇文章的作者有同樣的疑問,這樣重構 真的可以嗎?是如何實現松耦合的呢?不知道有沒有高手,可以指點一下?謝謝!首先是舊 如下 public class classregistr...