基于TCP的服务器端程序出错求助

micro_xzq 2013-06-19 10:27:36
下面是我写的基于Win32的对话框的服务器端的一个简单聊天程序,可是运行是程序崩溃了,求助大神,帮看看代码本身有什么问题?

先是头文件如下:
#include <afxwin.h>
#include <afxcmn.h>
#include <WINSOCK2.H>
//#pragma comment(lib,"WS2_32.lib")

class CMyApp:public CWinApp
{
public:
BOOL InitInstance();
};

class CMainDialog:public CDialog
{
public:
CMainDialog(CWnd* pParentWnd = NULL);
~CMainDialog();
protected:
CStatusBarCtrl m_bar;
CListBox m_listinfo;
SOCKET m_socket;
protected:
void OnButtonConnect();
virtual BOOL OnInitDialog();
virtual void OnCancel();
afx_msg BOOL OnConnect(LPCTSTR pszServerAddr,u_short nPort);
afx_msg void OnClear();
afx_msg void OnSend();
afx_msg long OnSocket(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
};

然后是源代码:
#include "TCPClient.h"
#include "resource.h"
#define WM_SOCKET WM_USER+1
CMyApp theApp;
BOOL CMyApp::InitInstance()
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,0);
::WSAStartup(sockVersion,&wsaData);
CMainDialog dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
::WSACleanup();
return FALSE;
}

CMainDialog::CMainDialog(CWnd* pParentWnd):CDialog(IDD_MAINDIALOG,pParentWnd)
{
}

CMainDialog::~CMainDialog()
{
}

BEGIN_MESSAGE_MAP(CMainDialog,CDialog)
ON_BN_CLICKED(IDC_CONNECT,OnConnect)
ON_BN_CLICKED(IDC_SEND,OnSend)
ON_BN_CLICKED(IDC_CLEAR,OnClear)
ON_MESSAGE(WM_SOCKET,OnSocket)
END_MESSAGE_MAP()

BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_bar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP,CRect(0,0,0,0),this,1050);
int arWidth[]={200,-1};
m_bar.SetParts(2,arWidth);
m_bar.SetText("空闲",0,0);
m_bar.SetText("Windows程序进阶之路",1,0);
m_listinfo.SubclassDlgItem(IDC_INFO,this);
m_socket = INVALID_SOCKET;
return TRUE;
}

BOOL CMainDialog::OnConnect(LPCTSTR pszServerAddr,u_short nPort)
{
m_socket=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_socket==INVALID_SOCKET)
return FALSE;
::WSAAsyncSelect(m_socket,m_hWnd,WM_SOCKET,FD_READ|FD_CLOSE|FD_WRITE|FD_CONNECT);
ULONG uAddr = ::inet_addr(pszServerAddr);
if(uAddr==INADDR_NONE)
{
HOSTENT *pHost = ::gethostbyname(pszServerAddr);
if(pHost==NULL)
{
::closesocket(m_socket);
m_socket=INVALID_SOCKET;
return FALSE;
}
uAddr = ((struct in_addr*)*(pHost->h_addr_list))->s_addr;
}
SOCKADDR_IN sockServer;
sockServer.sin_family = AF_INET;
sockServer.sin_addr.S_un.S_addr = uAddr;
sockServer.sin_port = htons(nPort);
::connect(m_socket,(SOCKADDR*)&sockServer,sizeof(SOCKADDR));
return TRUE;
}

void CMainDialog::OnButtonConnect()
{
if(m_socket==INVALID_SOCKET)
{
CString strAddr;
GetDlgItem(IDC_ADDR)->GetWindowText(strAddr);
if(strAddr.IsEmpty())
{
MessageBox("请输入服务器地址!");
return;
}
CString strPort;
GetDlgItem(IDC_PORT)->GetWindowText(strPort);
int nPort = atoi(strPort);
if(nPort<1||nPort>65535)
{
MessageBox("请重新输入端口号!");
return;
}
if(!OnConnect(strAddr,nPort))
{
MessageBox("连接服务器出错!");
return;
}
GetDlgItem(IDC_CONNECT)->SetWindowText("取消");
m_bar.SetText("正在连接...",0,0);
}
else
{
::closesocket(m_socket);
m_socket = INVALID_SOCKET;
GetDlgItem(IDC_CONNECT)->SetWindowText("连接服务器");
GetDlgItem(IDC_ADDR)->EnableWindow(TRUE);
GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_TEXT)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
}
}

void CMainDialog::OnClear()
{
m_listinfo.ResetContent();
}

void CMainDialog::OnCancel()
{
CDialog::OnCancel();
}

long CMainDialog::OnSocket(WPARAM wParam,LPARAM lParam)
{
SOCKET s = wParam;
if(WSAGETSELECTERROR(lParam))
{
if(m_socket!=SOCKET_ERROR)
OnButtonConnect();
m_bar.SetText("连接出错!",0,0);
return 0;
}

switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
GetDlgItem(IDC_CONNECT)->SetWindowText("断开连接");
GetDlgItem(IDC_ADDR)->EnableWindow(FALSE);
GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
GetDlgItem(IDC_TEXT)->EnableWindow(TRUE);
GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
m_bar.SetText("已连接到服务器",0,0);
break;
case FD_READ:
{
char sztext[1024]={0};
::recv(s,sztext,1024,0);
CString strItem = CString(sztext)+"\r\n";
m_listinfo.InsertString(0,strItem);
}
break;
case FD_CLOSE:
OnButtonConnect();
break;
}
return 0;
}

void CMainDialog::OnSend()
{
char szBuf[1024];
GetDlgItemText(IDC_TEXT,szBuf,1024);
::send(m_socket,szBuf,sizeof(szBuf)+1,0);
SetDlgItemText(IDC_TEXT,"");
}
...全文
273 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwspider001 2013-06-25
  • 打赏
  • 举报
回复
【运行时程序崩溃了】 能不能更详细些,程序启动时?还是连接时,还是? 看你的代码是一种折磨啊,呵呵 BEGIN_MESSAGE_MAP(CMainDialog,CDialog) ON_BN_CLICKED(IDC_CONNECT,OnButtonConnect) ON_BN_CLICKED(IDC_SEND,OnSend) ON_BN_CLICKED(IDC_CLEAR,OnClear) ON_MESSAGE(WM_SOCKET,OnSocket) END_MESSAGE_MAP() 看看红色的这句有什么变化
Sandrer 2013-06-25
  • 打赏
  • 举报
回复
现在的老师教编程,难道都没有教怎么排错的吗?
oyljerry 2013-06-25
  • 打赏
  • 举报
回复
出错的时候直接用编译器定位到出错的代码语句

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧