基于TCP的服务器端程序出错求助
下面是我写的基于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,"");
}