是不是一直在尋找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...