基于iocp的SOCKET通讯软件的设计
来源:优易学  2011-12-26 16:38:18   【优易学:中国教育考试门户网】   资料下载   IT书店

  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 消息处理程序

上一页  [1] [2] [3] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训