我使用netbios协议编写通信的程序:
先生成了如下一个类:
// QMessngr.h: interface for the CQMessngr class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_)
#define AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define WM_QMESSNGR_NOTIFY WM_USER//+1#define MAX_BUFFER_LENGTH 500
#define REPLY_LENGTH 35
#define SMB_HEADER_LENGTH 35
#define NAME_LENGTH 16
class CQMessngr
{
public:
CQMessngr();
virtual ~CQMessngr();
public: //发送函数
BOOL Send(char*sTo,char*sMsg); //启动/停止消息接收线程
//参数:HWND接收消息的窗口句柄,
//收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
// int Start(HWND hwnd);
// int Stop();
public:
//线程函数
// static UINT MsgMonitorProc(LPVOID param);
static CQMessngr *pseudoThis;//
static HWND hWndNotify;
public:
char m_sLocalName[16];
char m_sRemoteName[16];
char m_sMsg[400];
UCHAR m_sBuffer[500];
CWinThread *m_pThread;
};#endif // !defined(AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_)类的实现部分如下:
// QMessngr.cpp: implementation of the CQMessngr class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "NetCli.h"
#include "QMessngr.h"#pragma comment(lib,"netapi32.lib")
#pragma comment(lib,"ws2_32.lib")#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif#include "nb30.h"
#include "winsock2.h"//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CQMessngr *CQMessngr::pseudoThis=NULL;
HWND CQMessngr::hWndNotify=NULL;
void ToNcbName(char*str1,char*str2)
{
char pattern[20];
sprintf(pattern,"%%%ds",NAME_LENGTH);
sprintf(str2,pattern,"\3");
memcpy(str2,str1,strlen(str1));
}
CQMessngr::CQMessngr()
{
//成员变量初始化
WSADATA wsadata;
char name[NAME_LENGTH];
WSAStartup(MAKEWORD(2,0),&wsadata);
gethostname(name,NAME_LENGTH);
_tcsupr(name);
strcpy(m_sLocalName,name);
strcpy(m_sRemoteName,"*");
strcpy(m_sMsg,"");//NETBIOS初始化
NCB ncb;
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
int b=Netbios(&ncb); char ncbname[NAME_LENGTH];
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command=NCBADDNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
b=Netbios(&ncb);
//////////////////////////////////////////////
/* CNetDlg dlg;
if (b==0)
{
CString str;
str.Format("%d",(int)b);
dlg.MessageBox("Netbios调用成功,哈哈!");
}
else
dlg.MessageBox("Netbios调用失败,好合理!");
*/
////////////////////////////////////////////////////////
if(b==NRC_DUPNAME)
{
MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_OK);
return;
}
else if(b!=0)
{
MessageBox(NULL,"Messngr未知错误,初始化失败","警告",MB_OK);
}}CQMessngr::~CQMessngr()
{
NCB ncb;
char ncbname[NAME_LENGTH];
memset(&ncb,0,sizeof(ncb));
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command=NCBDELNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
int b=Netbios(&ncb);
}
//发送函数
BOOL CQMessngr::Send(char*sTo,char*sMsg)
{
NCB ncb;
char ncbname[NAME_LENGTH];
int bRet; 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);
unsigned char *pos=m_sBuffer+0x21;
int Length=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); return TRUE;
}
能后写了个按钮事件程序如下:
void CNetReceDlg::OnRecData()
{ CString xinxi;
CQMessngr recv;
recv.Start(hwnd);
xinxi=recv.pseudoThis->m_sMsg;
m_Address.SetWindowText(xinxi); //其中m_Address为文本 //框的控件变量
UpdateWindow();
}问题:
当程序运行时,文本框中无结果,程序大概2秒后弹出一个应用程序错误:"0x10218253"指令应用的”0x00130000"内存。该内存不能为"written"
请问这是怎么回事,问题在那?怎么样改正?
现将两个程序
其中NetCli.rar是要发送数据的程序,通过void CNetCliDlg::OnSendData()函数将 str1[]="bbb"发送给NetRece.rar数据接收应用程序,将接收到的数据用文本框显示出来。
问题:
两程序运行时,为什么得不到正确的结果,不能实现两程序的通信?请帮改正,谢谢!!
先生成了如下一个类:
// QMessngr.h: interface for the CQMessngr class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_)
#define AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#define WM_QMESSNGR_NOTIFY WM_USER//+1#define MAX_BUFFER_LENGTH 500
#define REPLY_LENGTH 35
#define SMB_HEADER_LENGTH 35
#define NAME_LENGTH 16
class CQMessngr
{
public:
CQMessngr();
virtual ~CQMessngr();
public: //发送函数
BOOL Send(char*sTo,char*sMsg); //启动/停止消息接收线程
//参数:HWND接收消息的窗口句柄,
//收到消息后会发送WM_MESSENGER_NOTIFY到该窗口
// int Start(HWND hwnd);
// int Stop();
public:
//线程函数
// static UINT MsgMonitorProc(LPVOID param);
static CQMessngr *pseudoThis;//
static HWND hWndNotify;
public:
char m_sLocalName[16];
char m_sRemoteName[16];
char m_sMsg[400];
UCHAR m_sBuffer[500];
CWinThread *m_pThread;
};#endif // !defined(AFX_QMESSNGR_H__F4C33B25_B056_4543_9C62_60BF857DB22B__INCLUDED_)类的实现部分如下:
// QMessngr.cpp: implementation of the CQMessngr class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "NetCli.h"
#include "QMessngr.h"#pragma comment(lib,"netapi32.lib")
#pragma comment(lib,"ws2_32.lib")#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif#include "nb30.h"
#include "winsock2.h"//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CQMessngr *CQMessngr::pseudoThis=NULL;
HWND CQMessngr::hWndNotify=NULL;
void ToNcbName(char*str1,char*str2)
{
char pattern[20];
sprintf(pattern,"%%%ds",NAME_LENGTH);
sprintf(str2,pattern,"\3");
memcpy(str2,str1,strlen(str1));
}
CQMessngr::CQMessngr()
{
//成员变量初始化
WSADATA wsadata;
char name[NAME_LENGTH];
WSAStartup(MAKEWORD(2,0),&wsadata);
gethostname(name,NAME_LENGTH);
_tcsupr(name);
strcpy(m_sLocalName,name);
strcpy(m_sRemoteName,"*");
strcpy(m_sMsg,"");//NETBIOS初始化
NCB ncb;
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
int b=Netbios(&ncb); char ncbname[NAME_LENGTH];
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command=NCBADDNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
b=Netbios(&ncb);
//////////////////////////////////////////////
/* CNetDlg dlg;
if (b==0)
{
CString str;
str.Format("%d",(int)b);
dlg.MessageBox("Netbios调用成功,哈哈!");
}
else
dlg.MessageBox("Netbios调用失败,好合理!");
*/
////////////////////////////////////////////////////////
if(b==NRC_DUPNAME)
{
MessageBox(NULL,"Messngr端口发现重名,初始化失败","警告",MB_OK);
return;
}
else if(b!=0)
{
MessageBox(NULL,"Messngr未知错误,初始化失败","警告",MB_OK);
}}CQMessngr::~CQMessngr()
{
NCB ncb;
char ncbname[NAME_LENGTH];
memset(&ncb,0,sizeof(ncb));
ToNcbName(m_sLocalName,ncbname);
ncb.ncb_command=NCBDELNAME;
memcpy((char*)ncb.ncb_name,ncbname,NAME_LENGTH);
int b=Netbios(&ncb);
}
//发送函数
BOOL CQMessngr::Send(char*sTo,char*sMsg)
{
NCB ncb;
char ncbname[NAME_LENGTH];
int bRet; 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);
unsigned char *pos=m_sBuffer+0x21;
int Length=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); return TRUE;
}
能后写了个按钮事件程序如下:
void CNetReceDlg::OnRecData()
{ CString xinxi;
CQMessngr recv;
recv.Start(hwnd);
xinxi=recv.pseudoThis->m_sMsg;
m_Address.SetWindowText(xinxi); //其中m_Address为文本 //框的控件变量
UpdateWindow();
}问题:
当程序运行时,文本框中无结果,程序大概2秒后弹出一个应用程序错误:"0x10218253"指令应用的”0x00130000"内存。该内存不能为"written"
请问这是怎么回事,问题在那?怎么样改正?
现将两个程序
其中NetCli.rar是要发送数据的程序,通过void CNetCliDlg::OnSendData()函数将 str1[]="bbb"发送给NetRece.rar数据接收应用程序,将接收到的数据用文本框显示出来。
问题:
两程序运行时,为什么得不到正确的结果,不能实现两程序的通信?请帮改正,谢谢!!
:"0x10218253"指令应用的”0x00130000"内存。该内存不能为"written"指针使用错误,检测所有使用到的指针的地方!