CSocket類的使用

2022-03-11 09:43:18 字數 2501 閱讀 6246

重點介紹乙個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表示位址結構的長度。例如使用者將上面建立的套接字物件與位址結構繫結,**如下:

1

csocket 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,客戶端連線伺服器,**如下:

1

csocket 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(const

void *lpbuf, int nbuflen, int nflags = 0

);2 virtural int receive(void *lpbuf, int nbuflen, int nflags = 0);

其中,函式send()用於傳送資料緩衝區的資料,函式receive()用於接收對方傳送的資料,並將資料放在指定的緩衝區中,引數lpbuf表示資料緩衝區位址。引數nbuflen表示緩衝區的大小。引數nflags表示資料傳送或結構的標誌,一般情況下,該引數設定為0,例如,使用這兩個函式進行資料的傳送和接收,**如下:

1

char szbuf = 'a'

;2 sock.send(szbuf, sizeof(szbuf), 0); //

傳送資料緩衝區中的資料

3 sock.receive(szbuf, sizeof(szbuf), 0); //

接收資料並存放在緩衝區中

當伺服器和客戶端的通訊完成之後,使用者還必須呼叫函式close()函式將套接字物件關閉。否則,程式可能在退出時發生錯誤,該函式原型如下:

1

virtual

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 都屬阻塞操作,即它們在成功完成或錯誤發生之前是不會返回的。在某些情況下,某項操作可能永遠不能成功完成,程式為了等待其完成就得永遠迴圈下去。在程式中為某項操作限定乙個成功...