CSocket設定超時(轉)
轉自:
https://bbs.csdn.net/topics/32591
setsockopt不好用,天啊,我該怎麼辦? |
用CAsyncSocket或Socket API 2.0 | |
謝謝,能否說清楚一點? | |
呵呵,順便問一下CAsyncSocket 怎麼設成blocking的socket? | |
aTT | |
CAsyncSocket裡面用 SetSockOpt(SO_RCVTIMEO,&nRcvTimeOut,sizeof(nRcvTimeOut)); 可以設定接受超時 | |
用CAsyncSocket::IOCtl(long lCommand, DWORD* lpArgument)來設定非阻塞模式 lpCommand為FIONBIO lpArgument指向一個為零的DWORD | |
MFC的CAsyncSocket、CSocket用的是winsock 1.0的API,所以無法在Socket中設定超時。 如果你非要用CSocket,只好自己在視窗中加個定時器來判斷超時了,還要設定為非阻塞模 式。如果你非要用Socket來直接判斷超時,建議你該用winsock 2.0的API來寫,可以設定 超時。 | |
我拷了一個類,我測試過了 /// sock.h #include "stdafx.h" class CSock : public CSocket { virtual BOOL ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen); virtual void OnClose( int nErrorCode ); public: CSock() { m_Kill = TRUE; } BOOL m_Kill; }; ///// sock.cpp #include "stdafx.h" #include "Sock.h" /// CSocket modify - timeout module. BOOL CSock::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen) { if (m_pbBlocking != NULL) { WSASetLastError(WSAEINPROGRESS); return FALSE; } m_nConnectError = -1; if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen)) { if (GetLastError() == WSAEWOULDBLOCK) { // Insert.... CTime curt, st; CTimeSpan span(0, 0, 0, m_nTimeOut); st = CTime().GetCurrentTime(); //....... while (PumpMessages(FD_CONNECT)) { if (m_nConnectError != -1) { WSASetLastError(m_nConnectError); return (m_nConnectError == 0); } // Insert.... curt = CTime().GetCurrentTime(); if(curt > (st+span)) return FALSE; //.............. } } return FALSE; } m_Kill = FALSE; return TRUE; } void CSock::OnClose(int nErrorCode) { m_Kill = TRUE; } | |
CSocket 沒什麼好辦法設超時 你可以用 socket 的 SDK API 那裡就很好用啦 超時完全自己控制,當然你要加自己的執行緒控制 但開銷比CSocket還是小很多的 | |
CSocket本身不能完成你的功能. Tiro說的是那個類我也用過,你可以參考之. | |
在CSocket中過載receive和send函式,然後直接操作m_hSocket變數。用FD_SET和select函式,具體的可以看MSDN。 | |
s | |
關於Tiro的程式的做法我有些建議。我看了一下MFC的源程式CSocket的m_nTimeOut變數是用在PumpMessage()函式中的,它的用途不是我們在這裡討論的這種,所以你的程式確實可以執行,很管用,但是我建議在CSock中再定義一個變數來代替這個變數。再有,我不知道ConnectHelper這個函式有什麼用,在哪裡被呼叫的。謝謝。 |
相關文章
- 徹底解決關於CSocket類的Receive超時的問題(轉)
- MFC下CSocket程式設計詳解(轉)程式設計
- CSocket 是阻塞的(轉)
- MongoDB 超時設定MongoDB
- SSH 超時設定
- **java設定一段程式碼執行超時時間(轉)**Java
- 2.6.7 設定DDL鎖超時
- dubbo 超時設定和原始碼分析原始碼
- libevent設定超時後取消超時(bufferevent_set_timeouts取消超時無效問題)
- mysql sql語句執行超時設定MySql
- Springboot 連線池wait_timeout超時設定Spring BootAI
- 一長篇論述CSocket,CAsyncSocket 的論壇文章(轉)
- 設定mysql 事務鎖超時時間 innodb_lock_wait_timeoutMySqlAI
- FFmpeg轉碼音影片時間戳設定分析時間戳
- Windows10系統下鎖定螢幕超時的設定方法Windows
- Jenkins定時設定Jenkins
- linux-wdt 原理和任意超時時間設定的解決方法Linux
- 記一次.net core 非同步執行緒設定超時時間非同步執行緒
- PHP CURL 業務呼叫第三方介面設定超時時間PHP
- linux設定埠轉發(一鍵設定)Linux
- 使用requests庫解決Session物件設定超時的問題Session物件
- Redis中Lua指令碼的使用和設定超時坍淑Redis指令碼
- jenkins設定任務超時⏱(多種方法:圖文並茂?)Jenkins
- 給 Angular 伺服器端渲染應用設定一個渲染超時時間Angular伺服器
- axios請求超時,設定重新請求的完美解決方法iOS
- 不要信任預設超時
- jvmlinux時區設定JVMLinux
- laydate設定預設時分秒
- python之為函式執行設定超時時間(允許函式執行的最大時間)Python函式
- 【半譯】擴充套件shutdown超時設定以保證IHostedService正常關閉套件
- 要查詢EMS快遞並設定超時狀態就這樣操作
- Docker映象時區設定Docker
- 開機時的設定
- Azure Function 時區設定Function
- 路由器WiFi定時開關設定教程 路由器WiFi定時開關怎麼設定?路由器WiFi
- [轉]MySQL的datetime設定當前時間為預設值及 triger 一例MySql
- 要查詢京東快遞並設定超時狀態就這樣操作
- JMeter定時器設定延遲與同步JMeter定時器