以下是一个按钮单击时执行的程序代码
问题1:为什么第一次调用Netbios(&ncb)函数能成功,第二次不能调用成功?
问题2:我的NCB结构设置是否错误?怎么才能正确设置?
问题3:那位有利用Netbios协议VC编写的类似聊天的程序代码,只要能实现最简单的发信息和接收信息即可
最后请个路高手鼎立帮助!谢谢!
void CNetDlg::OnQiDong() 
{
CString str="aaa";
NCB  ncb;
UCHAR uRetCode,uRetCode2;
PUCHAR pData;

ncb.ncb_command=NCBRESET;
    ncb.ncb_lana_num=0;
    uRetCode = Netbios(&ncb); //第一次调用Netbios(&ncb)函数
///////////////////////////////////////////////////////////////////
/*以下这段代码是用来检测第一次调用Netbios(&ncb)函数的,返回结果说明调用成功*/
    if (uRetCode==0)
{
 CString str;
 str.Format("%d",(int)uRetCode);
 m_Address.SetWindowText(str);
 MessageBox("Netbios调用成功!");
}
else
MessageBox("Netbios调用失败!");
///////////////////////////////////////////////////////////////////
/*以下代码目的:是想将字符串str="aaa"通过Netbios函数发给局域网上的某机器来实现
  两台机器的通信。但函数Netbios(&ncb)怎么都不能返回0,通信不成功。*/
ZeroMemory(&ncb, sizeof(NCB));
pData=(PUCHAR)malloc(sizeof(&str));
strcpy((char *)ncb.ncb_callname,"*");
ncb.ncb_command=NCBSENDNA;
ncb.ncb_buffer=(PUCHAR)pData;
ncb.ncb_length=str.GetLength();
uRetCode = Netbios(&ncb);//第二次调用Netbios(&ncb)函数
if (uRetCode=0)
 MessageBox("Netbios调用成功!");
 else
 MessageBox("Netbios调用失败!");
////////////////////////////////////////////////////////////////////}

解决方案 »

  1.   

    //
    //QMessngr.h#defineWM_QMESSNGR_NOTIFYWM_USER+1#defineMAX_BUFFER_LENGTH500
    #defineREPLY_LENGTH35
    #defineSMB_HEADER_LENGTH35
    #defineNAME_LENGTH16
    classCQMessngr
    {
    public:
    CQMessngr();
    virtual~CQMessngr();public://发送函数
    BOOLSend(char*sTo,char*sMsg);//启动/停止消息接收线程
    //参数:HWND接收消息的窗口句柄,
    //收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
    intStart(HWNDhwnd);
    intStop();//线程函数
    staticUINTMsgMonitorProc(LPVOIDparam);
    staticCQMessngr*pseudoThis;//
    staticHWNDhWndNotify;public:
    charm_sLocalName[16];
    charm_sMsg[400];
    UCHARm_sBuffer[500];
    CWinThread*m_pThread;};(待续)
    //QMessngr.cpp
    #pragmacomment(lib,"netapi32.lib")
    #pragmacomment(lib,"ws2_32.lib")CQMessngr*CQMessngr::pseudoThis=NULL;
    HWNDCQMessngr::hWndNotify=NULL;voidToNcbName(char*str1,char*str2)
    {
    charpattern[20];
    sprintf(pattern,"%%%ds",NAME_LENGTH);
    sprintf(str2,pattern,"\3");
    memcpy(str2,str1,strlen(str1));
    }CQMessngr::CQMessngr()
    {
    //成员变量初始化
    WSADATAwsadata;
    charname[NAME_LENGTH];
    WSAStartup(MAKEWORD(2,0),&wsadata);
    gethostname(name,NAME_LENGTH);
    _tcsupr(name);
    strcpy(m_sLocalName,name);
    strcpy(m_sRemoteName,"*");
    strcpy(m_sMsg,"");//NETBIOS初始化
    NCBncb;
    memset(&ncb,0,sizeof(ncb));
    ncb.ncb_command=NCBRESET;
    intb=Netbios(&ncb);charncbname[NAME_LENGTH];
    ToNcbName(m_sLocalName,ncbname);
    ncb.ncb_command=NCBADDNAME;
    memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);b=Netbios(&ncb);
    if(b==NRC_DUPNAME){
    MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_OK);
    return;
    }elseif(b!=0){
    MessageBox(NULL,"Messngr未知错误,初始化失败","警告",MB_OK);
    }
    }CQMessngr::~CQMessngr()
    {
    NCBncb;
    charncbname[NAME_LENGTH];
    memset(&ncb,0,sizeof(ncb));
    ToNcbName(m_sLocalName,ncbname);
    ncb.ncb_command=NCBDELNAME;
    memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
    intb=Netbios(&ncb);
    }//发送函数
    BOOLCQMessngr::Send(char*sTo,char*sMsg)
    {
    NCBncb;
    charncbname[NAME_LENGTH];
    intbRet;memset(&ncb,0,sizeof(ncb));
    ToNcbName(m_sLocalName,ncbname);
    memcpy((char*)ncb.ncb_name,ncbname,16);
    ToNcbName(sTo,ncbname);
    memcpy((char*)ncb.ncb_callname,ncbname,16);
    ncb.ncb_command=NCBCALL;
    bRet=Netbios(&ncb);//memset(buffer,0,sizeof(buffer));
    memset(m_sBuffer,0,sizeof(m_sBuffer));
    sprintf((char*)m_sBuffer,"%c%s%c",0xff,"SMB",0xD0);
    unsignedchar*pos=m_sBuffer+0x21;
    intLength=7+strlen(m_sLocalName)+strlen(sTo)+strlen(sMsg);
    *((WORD*)pos)=Length;
    pos+=2;
    *(pos++)=4;//TYPE
    strcpy((char*)pos,m_sLocalName);//MACHINENAME
    pos+=strlen(m_sLocalName)+1;
    *(pos++)=4;//TYPE
    strcpy((char*)pos,sTo);//MACHINENAME
    pos+=strlen(sTo)+1;
    *(pos++)=1;
    *((WORD*)pos)=strlen(sMsg);
    pos+=2;
    memcpy(pos,sMsg,strlen(sMsg));
    ncb.ncb_buffer=m_sBuffer;
    ncb.ncb_length=Length+0x23;
    ncb.ncb_command=NCBSEND;
    bRet=Netbios(&ncb);ncb.ncb_command=NCBRECV;
    ncb.ncb_buffer=m_sBuffer;
    ncb.ncb_length=MAX_BUFFER_LENGTH;
    bRet=Netbios(&ncb);ncb.ncb_command=NCBHANGUP;
    bRet=Netbios(&ncb);returnTRUE;
    }//初始化NETBIOS功能,启动消息接收线程
    //参数:HWND接收消息的窗口句柄,
    //收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
    intCQMessngr::Start(HWNDhwnd)
    {
    pseudoThis=this;
    hWndNotify=hwnd;
    m_pThread=AfxBeginThread(MsgMonitorProc,NULL);
    returnTRUE;}intCQMessngr::Stop()
    {
    TerminateThread(m_pThread->m_hThread,0);
    return0;
    }
    //线程函数
    UINTCQMessngr::MsgMonitorProc(LPVOIDparam)
    {
    NCBncb;
    charncbname[NAME_LENGTH];
    intbRet;while(TRUE)
    {
    ////////////LISTENONNAMESTUB//////////////
    memset(&ncb,0,sizeof(ncb));
    ToNcbName(pseudoThis->m_sLocalName,ncbname);
    memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
    strcpy((char*)ncb.ncb_callname,"*");
    ncb.ncb_command=NCBLISTEN;
    bRet=Netbios(&ncb);//RECEIVE THE NETBIOS BLOCK WHICH CONTAINING SMB DATA//
    ncb.ncb_command=NCBRECV;
    ncb.ncb_buffer=pseudoThis->m_sBuffer;
    ncb.ncb_length=MAX_BUFFER_LENGTH;
    bRet=Netbios(&ncb);////////////SEND NETBIOS ACK/////////////////
    pseudoThis->m_sBuffer[33]=0;
    ncb.ncb_length=REPLY_LENGTH;
    ncb.ncb_command=NCBSEND;
    bRet=Netbios(&ncb);///////////PARSE THE SMB PACKET//////////////
    //SMBStructure
    //TYPE1byte04Name
    //REMOTEMACHINENAMEstringterminatewith'\0'
    //TYPE1byte04Name
    //LOCALMACHINENAMEstringterminatewith'\0'
    //TYPE1byte01Message
    //LENGTH2byte
    //DATAstringwiththeLengthindicateinLENGTHunsignedchar*pos=pseudoThis->m_sBuffer+SMB_HEADER_LENGTH+1;
    strcpy(pseudoThis->m_sRemoteName,(char*)pos);
    pos+=strlen((char*)pos)+2;
    pos+=strlen((char*)pos)+2;
    WORDMsgLength=*((WORD*)pos);
    pos+=2;
    memset(pseudoThis->m_sMsg,0,sizeof(pseudoThis->m_sMsg));
    memcpy(pseudoThis->m_sMsg,(char*)pos,MsgLength);
    *(pseudoThis->m_sMsg+MsgLength)=0;////////////POSTAMESSAGETOTHENOTIFYWINDOW//////////
    PostMessage(hWndNotify,WM_QMESSNGR_NOTIFY,NULL,NULL);}
    return0;
    }
      

  2.   

    《Windows网络编程》第一版 第一章应该有相关内容如果是在2000操作系统下,好像要把IPX协议添加上,才能正确接收和发送数据
      

  3.   

    kingzai() :我调试你给我的程序代码,运行是弹出“Messngr端口发现重名,初始化失败”对话框,这是怎么回事啊,怎么解决这个问题?能不能帮我完善一下?
      

  4.   

    if(b==NRC_DUPNAME){
    MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_OK);