以下是一个按钮单击时执行的程序代码
问题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:为什么第一次调用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调用失败!");
////////////////////////////////////////////////////////////////////}
解决方案 »
- memcpy 导致Access Violation错误
- 删除ClistCtrl的内容后刷新
- 如何将 BSTR 转化为LPCSTR 类型 。。 急等。。 谢谢
- 急救~~电脑在大话西游每次结束的时候都会自动重启。。。。。。。。
- 多层次DLL调试问题?A.exe load b.dll b.dll隐式调用 c.dll, 怎么调试c.dll
- 高分!要怎么做想做一个和Ado 中 Fields一样的集合.
- 变脸大师(1.0)一周总下载量突破500次!!!!!!!!???如假给分100
- 初学SDK,应该看哪种书?
- VC BC中如何知道容器控件的信息,如程序是在编辑状态下,还是运行状态下?
- 本人说话绝对守信
- Winsock DLL初始化的问题还有就是CAsyncSocket和CSocket的问题
- 我的SOCKET为什么收不到UDP包? 急!!!
//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;
}
MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_OK);