evc与pc服务器网络连接
该程序只是简单的
现在的
请大家帮忙看看,是什么问题。
谢谢!
在server端(多文档),在菜单中有一个设置服务器地址和端口的选项,该程序片断如下:
void CMainFrame::OnNetworkPortsetting()
{
CSetPortDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_pListenSocket=new CListenSocket(this);
if(m_pListenSocket->Create(dlg.m_nPort))
{
if(!m_pListenSocket->Listen(5))
{
MessageBox("Socket Listening Failare","Error Message",MB_OK);
delete m_pListenSocket;
}
}
else
{
MessageBox("Create Socket Error!","Error Message",MB_OK);
delete m_pListenSocket;
}
}
}
Server中还有两个类,一个是CListenSocket类,负责监听客户端的响应,还有一个CAcceptSocket类,负责接收客户端的响应,同时回传信息给客户端。
在CListenSocket类中,有一个OnAccept函数,该函数负责接收客户的响应,程序片断如下:
void CListenSocket::OnAccept(int nErrorCode)
{
CAcceptSocket *pSocket=new CAcceptSocket(m_pMainFrame);
if(Accept(*pSocket))
{
m_pMainFrame->m_pAcceptList.AddTail(pSocket);
}
else
delete pSocket;
CSocket::OnAccept(nErrorCode);
}
在CAcceptSocket类中,有一个OnReceive函数,该函数负责接收客户传过来的文字信息,并将该信息回传给客户,程序片断如下:
void CAcceptSocket::OnReceive(int nErrorCode)
{
char pMsg[10000],tempMsg[1000];
int ByteCount;
int EndFlag=0;
char AnswerMsg[10100];
strcpy(pMsg,"");
do
{
strcpy(tempMsg,"");
ByteCount=Receive(tempMsg,1000);
if(ByteCount>1000||ByteCount<=0)
{
AfxMessageBox("Receive date error",MB_OK);
return;
}
else if(ByteCount<1000&&ByteCount>0)
{
EndFlag=1;
}
tempMsg[ByteCount]=0;
strcpy(pMsg,tempMsg);
}while(EndFlag==0);
AfxMessageBox(pMsg,MB_OK);
sprintf(AnswerMsg,"I receive your message\n\"%s\"\nThank you!",pMsg);
Send(AnswerMsg,strlen(AnswerMsg),0);
CSocket::OnReceive(nErrorCode);
在客户端,在MainFrame中,有三个菜单选项,分别是建立连接,关闭连接和发送消息,程序片断如下:
void CMainFrame::OnNetLink()
{
if(m_pSocket)
{
CString str="Connecting is success!";
CString str1="Error Message!";
MessageBox(str, str1);
return;
}
CLinkDlg m_LinkDlg;
if(m_LinkDlg.DoModal()==IDOK)
{
m_strServeName=m_LinkDlg.m_strAddress;
m_nPort=m_LinkDlg.m_nPortNumber;
m_pSocket=new CClientSocket(this);
if(!(m_pSocket=ConnectServe()))
{
delete m_pSocket;
return;
}
}
}
void CMainFrame::OnNetSend()
{
if(!m_pSocket)
{
CString str="This is not connecting!";
CString str1="Error Message!";
MessageBox(str, str1);
return;
}
CMessageDlg m_MessageDlg;
if(m_MessageDlg.DoModal()==IDOK)
{
TCHAR buf[129]; //发送缓冲区
ZeroMemory(buf,sizeof(buf)); //缓冲区清零
CString tmpstr(m_MessageDlg.m_strMessage); //复制要发送的字符串
int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数
CP_ACP, //根据ANSI code page转换
WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替
tmpstr.GetBuffer(m_MessageDlg.m_strMessage.GetLength()), //要转换的字符串地址
m_MessageDlg.m_strMessage.GetLength(), //要转换的个数
0, //转换后字符串放置的地址
0, //最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节
0, //缺省的字符:"\0"
0 //缺省的设置
);
WideCharToMultiByte( //转换Unicode到Ansi
CP_ACP,
WC_COMPOSITECHECK | WC_DEFAULTCHAR,
tmpstr.GetBuffer(m_MessageDlg.m_strMessage.GetLength()),
m_MessageDlg.m_strMessage.GetLength(),
(char *)buf, //转换到缓冲区中
128, //最多128个字节
0,
0
);
m_pSocket->Send(buf,multibytelen+1); //发送转换后的缓冲区
}
}
void CMainFrame::OnNetUnlink()
{
if(m_pSocket)
{
delete m_pSocket;
m_pSocket=NULL;
}
else
{
CString str="Connecting is failare!";
CString str1="Error Message!";
MessageBox(str, str1);
}
}
CClientSocket* CMainFrame::ConnectServe()
{
CClientSocket *pTempSocket=new CClientSocket(this);
if(!(pTempSocket->Create()))
{
delete pTempSocket;
CString str="Socket Error!";
CString str1="Error Message!";
MessageBox(str, str1);
return NULL;
}
if(!pTempSocket->Connect(m_strServeName,m_nPort))
{
delete pTempSocket;
CString str="Connecting Error!";
CString str1="Error Message!";
MessageBox(str, str1);
return NULL;
}
return pTempSocket;
}
还有一个ClientSocket类,其中有一个OnReceive函数,程序片断如下:
void CClientSocket::OnReceive(int nErrorCode)
{
TCHAR p[129]; //接受缓冲区
ZeroMemory(p,sizeof(p)); //接收缓冲区清零
int ByteCount=Receive(p,128);//
int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数
CP_ACP,
MB_COMPOSITE,
(char*)p, //要转换的Ansi字符串
-1, //自动计算长度
0,
0
);
CString tmpstr;
tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配
MultiByteToWideChar( //从Ansi转换到Unicode字符
CP_ACP,
MB_COMPOSITE,
(char*)p,
-1,
tmpstr.GetBuffer(widecharlen), //转换到tmpstr
widecharlen //最多转换widecharlen个Unicode字符
);
AfxMessageBox(tmpstr, MB_OK);
CSocket::OnReceive(nErrorCode);
}
浙公网安备 33010602011771号