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

micro_xzq micro_xzq 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面是我写的基于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,"");
}
...全文

相关推荐

我自己做得TCP监听本地端口的程序。。希望大家提出不足。。。

在这个程序中,开发者创建了一个服务器端应用,该应用可以接收来自客户端的连接请求,并处理通过TCP协议发送的数据。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

suckMahone

linux内核协议栈 TCP服务器端收到ACK包

Table of Contents 1 收到ACK报文处理过程概述 2 数据包入口tcp_v4_do_rcv 3 搜索 req_sock,创建新 sock (tcp_v4_hnd_req()核心) 3.1 SYN请求队列的搜索req_scok(inet_csk_search_req) 3.2创建建新sock,迁移req_sock到全连接队列 (tcp_check_req()核心) 4 创建新的 sock 过程tcp_v4_syn_recv_sock 4.1 创建新的 tcp sock...

老王不让用

tcp例程

这很可能分别代表一个TCP客户端程序和一个TCP服务器端程序。在TCP通信中,客户端首先发起连接请求,服务器端响应并建立连接,然后双方可以进行数据交换,最后由一方关闭连接。

ielts

Socket服务器端与客户端程序.txt

### 结论Socket编程是网络应用程序开发的基石,通过本段代码的学习,我们了解了如何在Windows环境下使用Winsock库实现Socket服务器端和客户端的基本功能。

公良将

Linux 操作系统 C 语言编程入门

- `run`:运行程序。 - `step`/`next`:单步执行。 - `print`:打印变量值。5. **头文件和系统求助**: - 头文件包含了函数声明和数据类型定义等。

ycwycf1
评论 3
收藏 已收藏
分享
返回顶部
micro_xzq
网络编程 18,356 成员 64,161 内容