重點介紹乙個mfc中csocket類的使用
使用csocket類建立套接字物件是通過該類的建構函式建立的。其原型如下:
1 csocket::csocket();
例如,使用者建立csocket類物件,**如下:
1 csocket sock;
如果使用者需要建立套接字物件指標,則應該使用關鍵字new進行建立。**如下:
1 csocket *sock;2 sock = new csocket;
1 bool bind(const sockaddr* lpsockaddr, int nsockaddrlen);
該函式的作用是將套接字物件與伺服器位址結構繫結在一起。如果函式呼叫成功,則返回true;否則返回false。引數lpsockaddr指定要繫結的伺服器位址結構,引數nsockaddrlen表示位址結構的長度。例如使用者將上面建立的套接字物件與位址結構繫結,**如下:
1csocket sock;
2sockaddr_in addr;
3 addr.sin_family =af_inet;
4 addr.sin_port = htons(80);5
//將字串ip轉換為網路位元組序排列的ip
6 addr.sin_addr.s_un.s_addr = inet_addr("
127.0.0.1");
7 sock.bind((sockaddr*)&addr, sizeof(addr));
1 bool listen(int nconnectionbacklog = 5);
引數nconnectionbacklog表示套接字監聽客戶端請求的最大數目。該引數的有效範圍是1-5。預設是5,表示該套接字只能監聽5個客戶端所傳送的連線請求。例如,套接字監聽5個客戶端的連線請求,**如下:
1 sock.listen(5);
客戶端建立套接字成功以後,可以呼叫函式connect()向伺服器傳送連線請求。函式原型如下:
1 bool connect(const sockaddr* lpsockaddr, int nsockaddrlen);
該函式呼叫成功則返回true,否則,將返回false。引數lpsockaddr表示將連線的伺服器位址結構。引數nsockaddrlen表示位址結構的長度大小。例如,伺服器ip位址為 「127.0.0.1」,埠為80,客戶端連線伺服器,**如下:
1csocket sock;
2sockaddr_in addr;
3 addr.sin_family =af_inet;
4 addr.sin_port = htons(80);5
//將字串ip轉換為網路位元組序排列的ip
6 addr.sin_addr.s_un.s_addr = inet_addr("
127.0.0.1");
7 sock.connect((sockaddr*)&addr, sizeof(addr));
無論是伺服器,還是客戶端都通過函式send()和receive()進行資料交換。函式原型如下:
1 virtural int send(constvoid *lpbuf, int nbuflen, int nflags = 0
);2 virtural int receive(void *lpbuf, int nbuflen, int nflags = 0);
其中,函式send()用於傳送資料緩衝區的資料,函式receive()用於接收對方傳送的資料,並將資料放在指定的緩衝區中,引數lpbuf表示資料緩衝區位址。引數nbuflen表示緩衝區的大小。引數nflags表示資料傳送或結構的標誌,一般情況下,該引數設定為0,例如,使用這兩個函式進行資料的傳送和接收,**如下:
1char szbuf = 'a'
;2 sock.send(szbuf, sizeof(szbuf), 0); //
傳送資料緩衝區中的資料
3 sock.receive(szbuf, sizeof(szbuf), 0); //
接收資料並存放在緩衝區中
當伺服器和客戶端的通訊完成之後,使用者還必須呼叫函式close()函式將套接字物件關閉。否則,程式可能在退出時發生錯誤,該函式原型如下:
1virtual
void close();
例如,客戶端關閉套接字物件,**如下:
sock.close();
套接字關閉的同時,也將伺服器與客戶端端之間的連線關閉了。
注意:當我們建立vc應用程式時,如果沒有為應用程式指定支援windows socket,那麼我們需要手動新增該類的標頭檔案afxsock.h,否則,程式將不能使用csocket類。
摘自:《visual c++ 網路程式設計案例實戰》 清華大學出版社
CSocket使用流程
csocket類是對casyncsocket 的繼承,因此它也封裝了windows api函式。相對於casyncsocket 類,csocket 是對windows socket api的更高階別的抽象化 心得 換言之,更容易使用,但難以進行如casyncsocket 般精準的通訊控制 csock...
關於CSocket類的Receive超時的問題
不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...
關於CSocket類的Receive超時的問題
不錯,搜到以下內容,很多 為csocket配置time out功能 csocket操作,如send receive connect 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...