關於OnClose函數,求教


我做一個服務器程序,很多終端跟我連接,我用的方法是設定一個套接字數組CMySocket s[64];
當有一個連接時,Accept函數為v
oid CSockDlg::OnAccept()
{m_sListenSocket.Accept(s[n]);
 n++;
}
現在當一個終端跟它斷開時,會觸發OnClose函數,求教如何寫OnClose函數,才能關閉其相對應的套接字?
意思就是假設s[0]斷開了,我怎么才能知道是s[0]斷開了,從而關閉s[0]套接字。。

11 个解决方案

#1


你將套接字保存為數組本來就是為了管理,我很奇怪既然知道Rev從哪來,也知道Send送去哪里,為什么就不知道CLOSE是屬於誰的呢?

#2


CSockDlg::OnClientClose(WPARAM wParam, LPARAM lParam)
{
    for(i=0;i<64;i++)
{
if(s[i]==wParam))
{
closesocket(s[i]);
s[i] = INVALID_SOCKET;
break;
}
}

#3


頂一下樓上

#4


只能比對SOCKET了

#5


就是比對socket

#6


OnClose由CMySocket類自己來處理不就得了?

#7


2樓的大哥。。OnClientClose(WPARAM wParam, LPARAM lParam)這個函數應該在OnClose調用對嗎?可是怎么填寫這兩個參數呢?
這句s[i] = INVALID_SOCKET;會報錯'CMySocket' : 'operator =' function is unavailable
怎么解決呢?
萬分感謝。。。

#8


ON_MESSAGE(WM_CLIENT_CLOSE, OnClientClose) 
....
ClientSocket = accept....
WSAAsyncSelect(ClientSocket,m_hWnd,WM_CLIENT_CLOSE,FD_CLOSE);
....

另外,沒有注意你的數組是CMySocket類,那么上面的s[i]應該改成你CMySocket類中的CSocket變量:s[i].變量

#9


class CSockDlg : public CDialog
{public:
void OnClose();
void OnReceive();
void OnSend();
void OnConnect();
void OnAccept();
CSockDlg(CWnd* pParent = NULL);
protected:
HICON m_hIcon;

private:
int n;
CMySocket m_sListenSocket;
CMySocket s[64];
};
void CSockDlg::OnBconnect() 
{

UpdateData(TRUE);
m_sListenSocket.Create(4000);
m_sListenSocket.Listen();
}

void CSockDlg::OnAccept()
{
   
  m_sListenSocket.Accept(s[n]);
  n++;
 }

void CSockDlg::OnConnect()
{}

void CSockDlg::OnSend()
{
}
void CSockDlg::OnClose()
{

}
這是我那個程序的連接部分的簡化,我想當OnClose被觸發的時候,怎么才能改動相應的套接子?順便問一下,套接字的是否在使用的標志是什么?
謝謝了,初學這方面。。實在太笨了。。

#10


沒有辦法在你給出的代碼中修改,但是編寫方法如下:
1、自定義一個事件WM_CLIENT_CLOSE
2、當通過accept接受一個連接后,設置WSAAsyncSelect(ClientSocket, m_hWnd, WM_CLIENT_CLOSE, FD_CLOSE);,這樣,當連接關閉時會觸發WM_CLIENT_CLOSE消息
3、處理WM_CLIENT_CLOSE消息,wParam中存放的就是需要關閉的socket

套接字沒有是否在使用的標志,但是當套接字建立成功后一定不等於INVALID_SOCKET,不過,不等於INVALID_SOCKET 不等於套接字在使用

#11


學習!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com