这是最简单的方法
否则的话要用NetBIOS调用
很麻烦的说

解决方案 »

  1.   

    如果仅仅是发消息,NT下有函数支持,也可以和9x下一样用mailslot。但是要想绕过NT的消息服务,截获对方发过来的消息,就有难度了。如果需要EXE我可以免费提供给你,源代码是不可能免费的。
      

  2.   

    截获消息是这个意思:
    在NT和2K下,如果Messenger服务已启动(一般是自动启动),其它机器通过NET SEND发过来的消息都会激活Messenger的对话框,显示出收到的消息。如果你真的想做一个聊天程序,当然不希望看到这个窗口,因此必须对消息进行截获,不让Messenger弹出窗口。
    一般不能停止Messenger服务,否则网络更新可能会出问题。
      

  3.   

    noho,如果你能够用NetBIOS和Messenger通上讯,请告诉我一声。按MSDN的说法,Win 9x下带的WinPop是用mailslot通讯,mailslot再调用NetBIOS,但是我用NetBIOS试了很久都没有成功。用mailslot很快就发送成功了。
      

  4.   

    公布一个我在网上找到的CNCB类
    // cncb.h -- defines the data type CNCB as a helper for CNetBIOS#include <nb30.h>
    #pragma comment(lib,"netapi32.lib")
    #define LANA_NUM 0
    //#define MAXMACHINENAME 16
    // compound structurestypedef struct ADAPTER_STATUS_BLOCK
    {ADAPTER_STATUS asb_header;
     NAME_BUFFER asb_Names[NCBNAMSZ];
    } ADAPTER_STATUS_BLOCK, *PADAPTER_STATUS_BLOCK;typedef struct SESSION_INFO_BLOCK
    {SESSION_HEADER sib_header;
     SESSION_BUFFER sib_Names[NCBNAMSZ];
    } SESSION_INFO_BLOCK, *PSESSION_INFO_BLOCK;typedef struct  {
        UCHAR Protocol[4];                // Contains 0xFF,'SMB'
        UCHAR Command;                    // Command code
        union {
            struct {
                UCHAR ErrorClass;         // Error class
                UCHAR Reserved;           // Reserved for future use
                USHORT Error;             // Error code
            } DosError;
            ULONG Status;                 // 32-bit error code
        } Status;
        UCHAR Flags;                      // Flags
        USHORT Flags2;                    // More flags
        union {
            USHORT Pad[6];                // Ensure this section is 12 bytes long
            struct {
                USHORT PidHigh;           // High part of PID
                ULONG  Unused;            // Not used
                ULONG  Unused2;
        } Extra;
        };
        USHORT Tid;                       // Tree identifier
        USHORT Pid;                       // Caller's process id
        USHORT Uid;                       // Unauthenticated user id
        USHORT Mid;                       // multiplex id
    //    UCHAR  WordCount;                 // Count of parameter words
    //    USHORT ParameterWords[ WordCount ];    // The parameter words
    //    USHORT ByteCount;                 // Count of bytes
    //    UCHAR  Buffer[ ByteCount ];       // The bytes
    } SMB_HEADER;void MakeNetBIOSName(char * pszName, char * pszPaddedName, UCHAR Uni);class CNCB

    private:
    NCB m_NCB;
    public:
    // constructor
    CNCB();
    // helper function
    void ClearNCB();
    UCHAR GetLSN();
    WORD GetLength();
    void Fill(CNCB ncbSource);
    UCHAR GetCommand();
    // Name Management Services
    UCHAR AddName(PSTR pName);
    UCHAR AddGroupName(PSTR pName);
    UCHAR DeleteName(PSTR pName);
    UCHAR FindName();// Data Transfer Services
    UCHAR Call(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO);   // fill in parameters later;;;
    UCHAR Listen(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO);
    UCHAR Hangup(UCHAR wSessionNumber);
    // Connectionless Data Transfer
    UCHAR Cancel();
    UCHAR Send(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength);
    UCHAR SendNoAck();
    UCHAR SendDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength);
    UCHAR SendBroadcastDatagram();
    UCHAR Receive(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength);
    UCHAR ReceiveAny();
    UCHAR ReceiveDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength);
    UCHAR ReceiveBroadcastDatagram();
    UCHAR ChainSend();
    UCHAR ChainSendNoAck();// General Purpose Services
    UCHAR Reset(UCHAR wSessions, UCHAR wNCBs);
    UCHAR GetAdapterStatus(PSTR pName);
    UCHAR GetSessionStatus(PSTR pName);
    UCHAR EnumerateAdapters();
    UCHAR StatusAlert();
    UCHAR Action();
    };
    // cncb.cpp -- implements the data type CNCB as a helper for CNetBIOS
    #include "stdafx.h"
    #include "cncb.h"CNCB::CNCB()
    {
    };void CNCB::ClearNCB()
    {memset((void *)&m_NCB,0,sizeof(NCB));
    };UCHAR CNCB::GetLSN()
    { return m_NCB.ncb_lsn;
    };WORD CNCB::GetLength()
    { return m_NCB.ncb_length;
    };void CNCB::Fill(CNCB ncbSource)
    {memcpy(&m_NCB,&ncbSource.m_NCB,sizeof(NCB));
    };UCHAR CNCB::GetCommand()
    {
     return m_NCB.ncb_command;
    };
    /*********************************************************/
    UCHAR CNCB::AddName(PSTR pName)
    {ClearNCB();
     m_NCB.ncb_command = NCBADDNAME;
     m_NCB.ncb_lana_num = LANA_NUM;
     strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::AddGroupName(PSTR pName)
    {ClearNCB();
     m_NCB.ncb_command = NCBADDGRNAME;
     m_NCB.ncb_lana_num = LANA_NUM;
     strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::DeleteName(PSTR pName)
    {ClearNCB();
     m_NCB.ncb_command = NCBDELNAME;
     m_NCB.ncb_lana_num = LANA_NUM;
     strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
     return (Netbios(&m_NCB));
    };/*********************************************************/
    UCHAR CNCB::FindName()
    { return 0;};// Data Transfer Services
    /*********************************************************/
    UCHAR CNCB::Call(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO)
    {ClearNCB();
     strncpy((char *)&m_NCB.ncb_name,pWe,NCBNAMSZ);
     strncpy((char *)&m_NCB.ncb_callname,pTheOther,NCBNAMSZ);
     m_NCB.ncb_rto = wRecvTO;
     m_NCB.ncb_sto = wSendTO;
     m_NCB.ncb_command = NCBCALL;
     return (Netbios(&m_NCB));
    };/*********************************************************/
    UCHAR CNCB::Listen(PSTR pWe,PSTR pTheOther,UCHAR wSendTO,UCHAR wRecvTO)
    {ClearNCB();
     strncpy((char *)&m_NCB.ncb_name,pWe,NCBNAMSZ);
     strncpy((char *)&m_NCB.ncb_callname,pTheOther,NCBNAMSZ);
     m_NCB.ncb_rto = (UCHAR)wRecvTO;
     m_NCB.ncb_sto = (UCHAR)wSendTO;
     m_NCB.ncb_command = NCBLISTEN;
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::Hangup(UCHAR wSessionNumber)
    {ClearNCB();
     m_NCB.ncb_command = NCBHANGUP;
     m_NCB.ncb_lsn = wSessionNumber;
     return (Netbios(&m_NCB));
    };
    // Connectionless Data Transfer
    /*********************************************************/
    UCHAR CNCB::Cancel()
    {
     CNCB cbCanceller;
     cbCanceller.ClearNCB();
     cbCanceller.m_NCB.ncb_buffer = (unsigned char *)&m_NCB;
     cbCanceller.m_NCB.ncb_length = sizeof(NCB);
     cbCanceller.m_NCB.ncb_command = NCBCANCEL;
     return (Netbios(&cbCanceller.m_NCB));};
    /*********************************************************/
    UCHAR CNCB::Send(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength)
    {ClearNCB();
     if (wLength > 0xffff) RaiseException(EXCEPTION_ACCESS_VIOLATION,0,0,NULL);
     m_NCB.ncb_command = NCBSEND;
     m_NCB.ncb_lsn = wSessionNumber;
     m_NCB.ncb_length = wLength;
     m_NCB.ncb_buffer = (unsigned char *)lpPacket;
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
     UCHAR CNCB::SendNoAck()
     { return 0;};
    /*********************************************************/
    UCHAR CNCB::SendDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength)
    {ClearNCB();
     m_NCB.ncb_command = NCBDGSEND;
     m_NCB.ncb_lsn = wSessionNumber;
     m_NCB.ncb_length = wLength;
     m_NCB.ncb_buffer = (unsigned char *)lpPacket;
     return (Netbios(&m_NCB));
    }; 
    /*********************************************************/
    UCHAR CNCB::SendBroadcastDatagram()
    { return 0;};
    /*********************************************************/
    UCHAR CNCB::Receive(UCHAR wSessionNumber,LPSTR lpPacket, UINT wLength)
    {ClearNCB();
     m_NCB.ncb_command = NCBRECV;
     m_NCB.ncb_lsn = wSessionNumber;
     // do not hardcode that!!!
     if (wLength > 0xffff) m_NCB.ncb_length = 0xffff; else
     m_NCB.ncb_length = wLength;
     m_NCB.ncb_buffer = (unsigned char *)lpPacket;
     return (Netbios(&m_NCB));
    };
    UCHAR CNCB::ReceiveDatagram(UCHAR wSessionNumber,LPSTR lpPacket, WORD wLength)
    {ClearNCB();
     m_NCB.ncb_command = NCBDGRECV;
     m_NCB.ncb_lsn = wSessionNumber;
     m_NCB.ncb_length = wLength;
     m_NCB.ncb_buffer = (unsigned char *)lpPacket;
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::ReceiveBroadcastDatagram()
    { return 0;};
    /*********************************************************/
    UCHAR CNCB::ChainSend()
    { return 0;};
    /*********************************************************/
    UCHAR CNCB::ChainSendNoAck()
    { return 0;};// General Purpose Services
    UCHAR CNCB::Reset(UCHAR wSessions, UCHAR wNCBs)
    {ClearNCB();
     m_NCB.ncb_command = NCBRESET;
     m_NCB.ncb_lsn = wSessions;
     m_NCB.ncb_num = wNCBs;
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::GetAdapterStatus(PSTR pName)
    {ClearNCB();
     ADAPTER_STATUS_BLOCK asStatus;
     memset(&asStatus,0,sizeof(ADAPTER_STATUS_BLOCK));
     strncpy((char *)&m_NCB.ncb_callname,pName,NCBNAMSZ);
     m_NCB.ncb_command = NCBASTAT;
     m_NCB.ncb_lana_num = LANA_NUM;
     m_NCB.ncb_length = sizeof(ADAPTER_STATUS_BLOCK);
     m_NCB.ncb_buffer = (unsigned char *)&asStatus;
     return (Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::GetSessionStatus(PSTR pName)
    {ClearNCB();
     SESSION_INFO_BLOCK sibSession;
     memset(&sibSession,0,sizeof(SESSION_INFO_BLOCK));
     strncpy((char *)&m_NCB.ncb_name,pName,NCBNAMSZ);
     m_NCB.ncb_command = NCBSSTAT;
     m_NCB.ncb_lana_num = LANA_NUM;
     m_NCB.ncb_buffer = (unsigned char *)&sibSession;
     m_NCB.ncb_length = sizeof(SESSION_INFO_BLOCK);
     return(Netbios(&m_NCB));
    };
    /*********************************************************/
    UCHAR CNCB::EnumerateAdapters()
    { return 0;};
    /*********************************************************/
    UCHAR CNCB::StatusAlert()
    { return 0;};
    /*********************************************************/
    UCHAR CNCB::Action()
    { return 0;};void MakeNetBIOSName(char * pszName, char * pszPaddedName, UCHAR Uni)

      if (pszName) strcpy(pszPaddedName,pszName);
      strupr(pszPaddedName);
      unsigned int iLoop;
      for (iLoop=strlen(pszPaddedName);iLoop<NCBNAMSZ;iLoop++)
        pszPaddedName[iLoop]=' ';
      pszPaddedName[NCBNAMSZ-1]=Uni;
     };发消息:
    CNCB::Call
    CNCB::Send
    CNCB::Hangup
    收消息:
    CNCB::AddName
    CNCB::Listen
    CNCB::GetLSN
    CNCB::Send
    CNCB::Hangup
      

  5.   

    不过接受消息一方必须停掉Messanger服务才行,不停掉服务的方法我还不知道。