我由CSocket派生了一个类 CClientSocke,在一个应用程序中使用没有问题
重载了CSocket:Onclose消息,如果对方断线,我在CClientSocket::OnClose()中做相应的处理,这个类在一个可执行的程序中没有问题  于是我把这个类放在一个dll中,由一个应用程序产生一个线程,线程通过CClientSocket与远程主机建立连接,但这时,如果远程主机断线,CClientSocket的OnClose消息没有执行,但如果在这个应用程序中我不通过线程来调用CClientSOcket建 立连接的话,对于Onclose消息是会执行的。是线程的问题,还是CSocket的问题?该怎么解决?或有没有更好的socket类?

解决方案 »

  1.   

    因为CSocket需要一个窗口来进行消息循环。一般的工作者线程只有消息队列,没消息循环。以前也有同样的问题,你可以搜索一下。但我没有试过其中提到的方法。我以前也用CSocket,但是在线程中还是不是很好用,现在都不用了。
      

  2.   

    CSocket在跨线程传递的时候会出现SOCKET句柄无效,建议在多线程下直接用SOCKET API
      

  3.   

    同意 jeffchen(Jeff) 的意见,多线程下最好直接用底层的API。觉得麻烦,自己封个Socket也好.
      

  4.   

    是啊,我重新封了一个socket,但是不知道如何当断线时通知对象,类定义如下
    比如我想实现,当远程主机断线时,我发出一个消息通知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;}
      

  5.   

    调用:AsyncSocket(FD_CLOSE)函数设置后,
    当socket关闭时将调用此类的OnClose()函数
      

  6.   

    你是阻塞Socket啊,没有任何错误处理,你先试想一下怎么工作,
    首先.CClientScoket m_socket(pServer);
    m_socket.Connect(...);
    m_socket.Send(...);
    m_socket.Recevie(...);
    线程会死守在那里啊,超时又怎么处理,断线又怎么处理,缓冲区溢出...
    实际上你的错误处理都是从Send 和Recevie产生出来的。当然是由外部调用他的线程或者函数来SendMessage啊!要他这个类本身发消息??? 发给谁? 连传入的窗口句柄都没有,而且不存在消息循环。如果要从Socket本身的事件来考虑,那你做啊做的,不是又做回成了CSocket?? 等于自己写一遍MFC的CSocket类。
      

  7.   

    照你的说法,我只能设成异同socket才能处理确认,我是把CSocket重写了一遍
      

  8.   

    不对,多线程中阻塞Socket可以处理,发出通知由调用类或者线程来发出!或者你有更好的方法,也可以多说说
      

  9.   

    堂堂csdn,居然没人看过或用过这样的socket类,在线程中使用的socket类?
    难道大家都用CSocket???