我使用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数据接收应用程序,将接收到的数据用文本框显示出来。
问题:
两程序运行时,为什么得不到正确的结果,不能实现两程序的通信?请帮改正,谢谢!!