Pingo520 软件工程师  2017年02月21日
CAsyncSocket网络编程问题
先上代码

BOOL COnlineMonitorDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
hObject = ::CreateMutex(NULL, FALSE, _T("Mutex20170217"));
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);

MessageBox(_T("应用程序已经在运行"), _T("提示"), MB_ICONERROR | MB_OK);
DestroyWindow();
return FALSE;
}
// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此添加额外的初始化代码
server = new CMySocket(this);
char szName[256] = { 0 };
hostent *pHostent = gethostbyname(szName);
char* pszIP = inet_ntoa(*(in_addr*)pHostent->h_addr_list[0]);

if (!AfxSocketInit())
{
delete server;
server = NULL;
return FALSE;
}

if (!server->Socket())
{
delete server;
server = NULL;
return FALSE;
}

BOOL boptValue = FALSE;
int optValueLen = sizeof(boptValue);
server->SetSockOpt(SO_REUSEADDR, (void*)&boptValue, optValueLen, SOL_SOCKET);

if (!server->Bind(1024))
{
server->Close();
delete server;
server = NULL;
return FALSE;
}

if (!server->Listen())
{
server->Close();
delete server;
server = NULL;
return FALSE;
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void NTAPI ThreadFunc(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK word)
{
/*CString s;
s.Format(_T("%d线程开始运行!"), GetCurrentThreadId());
AfxMessageBox(s);*/
BYTE* pData = (BYTE*)context;
delete[] pData;

}
void COnlineMonitorDlg::OnAccept()
{
CMySocket* m_recvSocket = new CMySocket(this);

if (!server->Accept(*m_recvSocket))
{
delete m_recvSocket;
m_recvSocket = NULL;
return;
}
socketList.AddTail(m_recvSocket);
}
void COnlineMonitorDlg::OnClose(CMySocket * msocket)
{
for (int i = 0; i < socketList.GetCount(); i++)
{
POSITION pos = socketList.FindIndex(i);
CMySocket* temp = socketList.GetAt(pos);
if (temp == msocket)
{
temp->Close();
delete temp;
socketList.RemoveAt(pos);
}
}
}
void COnlineMonitorDlg::OnReceive(CMySocket * recvSocke)
{
BYTE data[5] = { 0 };
int start = 0;
int n = 0;
if (n = recvSocke->Receive(data, 5))
{
CString header;
header.Format(_T("%02X%02X%02X"), data[0], data[1], data[2]);

UINT data_len = 0;
CString hex;
hex.Format(_T("%02X%02X"), data[3], data[4]);

data_len = Hex2Ten(hex);

BYTE *allData = new BYTE[data_len+7];
int sum = n;
while (sum < data_len + 7)
{
memcpy(allData + start, data, n);
start += n;

n = recvSocke->Receive(data, 5);
sum += n;
}
memcpy(allData + start, data, n);

PTP_WORK item = CreateThreadpoolWork(ThreadFunc, (PVOID)allData, NULL);
SubmitThreadpoolWork(item);
}
}

上面就是主要代码。
然后按F5进行调试,在onAccept,OnReceive,OnClose,ThreadFunc四处设置断点,用网络调试助手连接,发送一段数据,发现前面几次发送的数据server能够接收到,但是后面不管怎么发都接不到。也就是OnReceive在后面几次的发送中都不触发断点。断开调试助手的连接,发现会触发OnClose断点,说明TCP连接是没有断开的。然后用调试助手重新连接server,都正常,再发送数据,又是前面几次发送正常,后面就再也接收不到数据。
求问可能是什么原因造成的。调试i的时候还只开了一个连接进行测试。
...全文
151 点赞 收藏 17
写回复
17 条回复

还没有回复,快来抢沙发~

发动态
发帖子
网络编程
创建于2007-09-28

7878

社区成员

6.4w+

社区内容

VC/MFC 网络编程
社区公告
暂无公告