OVERLAPPEDPLUS* pOlp = new OVERLAPPEDPLUS;
ZeroMemory(pOlp, sizeof(OVERLAPPEDPLUS));
ZeroMemory(&(pOlp->ol), sizeof(OVERLAPPED));
pOlp->socket = sockAccept;
pOlp->dwFlags = 0;
pOlp->wsaBuf.buf = pOlp->pBuf;
pOlp->wsaBuf.len = 4096;
pOlp->nOpCode = FD_READ;
nRet = WSARecv(pOlp->socket, &(pOlp->wsaBuf), 1, &(pOlp->dwBytes), &(pOlp->dwFlags), &(pOlp->ol), NULL);
if(SOCKET_ERROR == nRet)
{
if(WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSARecv() failed with error %d\n", WSAGetLastError());
return;
}
}
}
return;
}
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
HANDLE hCompletionPort = (HANDLE) CompletionPortID;
void* re;
DWORD berByte;
OVERLAPPED* pOl;
while(TRUE)
{
BOOL bRet = GetQueuedCompletionStatus(hCompletionPort, &berByte, (LPDWORD)&re, (LPOVERLAPPED*)&pOl, INFINITE);
if(!bRet)
{
printf("GetQueuedCompletionStatus failed with error %d\n", GetLastError());
return FALSE;
}
if(0 == berByte)
{
printf("DGFDGDGF\n");
return FALSE;
}
OVERLAPPEDPLUS* pOlp = (OVERLAPPEDPLUS*) pOl;
switch(pOlp->nOpCode)
{
case FD_READ:
printf("%s\n", pOlp->wsaBuf.buf);
break;
default:
printf("no data!!\n");
}
pOlp->nOpCode = FD_READ;
WSARecv(pOlp->socket, &(pOlp->wsaBuf), 1, &(pOlp->dwBytes), &(pOlp->dwFlags), &(pOlp->ol), NULL);
}
return TRUE;
}
测试客户端的程序代码如下:
// SocketClientDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SocketClient.h"
#include ".\socketclientdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CSocketClientDlg 对话框
CSocketClientDlg::CSocketClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSocketClientDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSocketClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSocketClientDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_SEND, OnBnClickedSend)
ON_BN_CLICKED(IDC_BTN_CONNECT, OnBnClickedBtnConnect)
END_MESSAGE_MAP()
// CSocketClientDlg 消息处理程序
责任编辑:小草