我由CSocket派生了一个类 CClientSocke,在一个应用程序中使用没有问题
重载了CSocket:Onclose消息,如果对方断线,我在CClientSocket::OnClose()中做相应的处理,这个类在一个可执行的程序中没有问题 于是我把这个类放在一个dll中,由一个应用程序产生一个线程,线程通过CClientSocket与远程主机建立连接,但这时,如果远程主机断线,CClientSocket的OnClose消息没有执行,但如果在这个应用程序中我不通过线程来调用CClientSOcket建 立连接的话,对于Onclose消息是会执行的。是线程的问题,还是CSocket的问题?该怎么解决?或有没有更好的socket类?
重载了CSocket:Onclose消息,如果对方断线,我在CClientSocket::OnClose()中做相应的处理,这个类在一个可执行的程序中没有问题 于是我把这个类放在一个dll中,由一个应用程序产生一个线程,线程通过CClientSocket与远程主机建立连接,但这时,如果远程主机断线,CClientSocket的OnClose消息没有执行,但如果在这个应用程序中我不通过线程来调用CClientSOcket建 立连接的话,对于Onclose消息是会执行的。是线程的问题,还是CSocket的问题?该怎么解决?或有没有更好的socket类?
解决方案 »
- 关于使用SetWindowPos()函数后窗口滚动条消失的问题
- 求SQLBulkOperations的 例子。
- 应用程序的安装如何把两个程序集成到一快
- huang_yi_cn (蓝色的云) 过来接分, 闲人勿扰
- 編譯到CList<PANELDATA,PANELDATA&> m_PanelList(255); 出現error C2059: syntax error : 'constant'。
- TRY和CATCH的用法问题
- 有没有做过在线安装程序的,100分请教一下怎样做在线安装程序?
- 运行时弹出一个窗体,在窗体中有一个文本框和一个按钮,按此按钮后,文本框显示“你好!!”。请给出VC实现以上功能的详细步骤及程序。谢谢!
- 一个简单问题(可对于我这个初学者却把我给难倒了)
- MFC对话框中嵌入Excel窗口造成Excel菜单栏消失的诡异现象
- 移动工作的达人或是面世过移动的进!
- 请问谁知道那个函数可以得到硬盘的硬件序列号?成功就给分!
比如我想实现,当远程主机断线时,我发出一个消息通知CClientSocket类或pServer类,我该怎么办?class CClientSocket
{
public:// Operations
public:
CClientSocket();
CClientSocket(CServer *pServer);
SOCKET client;
virtual ~CClientSocket();// Overrides
public:
int Create();
int Connect(CString RemoteHost,int Port);
int Close();
int Receive(void *buf,int len,int flag=0);
int Send(void *buf,int len,int flag=0);
CServer *pServer;
public:
virtual void OnClose(int nErrorCode);
protected:
};
CClientSocket::CClientSocket(CServer *pServer)
{
this->pServer=pServer;}
int CClientSocket::Send(void *buf, int len, int flag)
{
int iRet=0;
iRet=send(client,(char *)buf,len,flag);
return iRet;
}int CClientSocket::Receive(void *buf, int len, int flag)
{
int iRet=0;
iRet=recv(client,(char *)buf,len,flag);
return iRet;}int CClientSocket::Close()
{
closesocket(client);
return 1;}int CClientSocket::Connect(CString RemoteHost, int Port)
{ struct sockaddr_in sinClient; char hostip[19];
strcpy(hostip,RemoteHost);
sinClient.sin_family=AF_INET;
sinClient.sin_port=htons(Port);
sinClient.sin_addr.s_addr=inet_addr(hostip);
int iRet;
iRet=connect(client,(sockaddr *)&sinClient,sizeof(sinClient));
if (iRet!=0)
{
return -1;
}
else
{ return 1;
}}int CClientSocket::Create()
{
client=socket(AF_INET,SOCK_STREAM,0);
return smppclient;}
当socket关闭时将调用此类的OnClose()函数
首先.CClientScoket m_socket(pServer);
m_socket.Connect(...);
m_socket.Send(...);
m_socket.Recevie(...);
线程会死守在那里啊,超时又怎么处理,断线又怎么处理,缓冲区溢出...
实际上你的错误处理都是从Send 和Recevie产生出来的。当然是由外部调用他的线程或者函数来SendMessage啊!要他这个类本身发消息??? 发给谁? 连传入的窗口句柄都没有,而且不存在消息循环。如果要从Socket本身的事件来考虑,那你做啊做的,不是又做回成了CSocket?? 等于自己写一遍MFC的CSocket类。
难道大家都用CSocket???