采用重叠I/O技术的Socket客户端代码

本文详细介绍了如何利用重叠I/O技术来构建一个高性能的Socket客户端。通过这种方式,可以实现非阻塞的I/O操作,提高并发处理能力。文章涵盖了重叠I/O的概念、Windows平台下的完成端口(IOCP)使用,以及如何结合线程池来处理异步事件。
摘要由CSDN通过智能技术生成

 

#ifdef _DEBUG
#define GMT_ASSERT(exp)  assert(exp)
#else
#define GMT_ASSERT(exp)
#endif
#define PORT 5150
#define DATA_BUFSIZE 8192
// Overlapped event.
#define RECV_WSAEVENT 0
#define SEND_WSAEVENT 1
#define CTRL_IOTHREAD_WSAEVENT 2
#define WSAEVENT_COUNT 3
// Index of thread type.
#define SEND_THREAD  0
#define IO_THREAD  1
#define THREAD_COUNT 2
typedef struct _SOCKET_INFORMATION {
 char szIOBuffer[DATA_BUFSIZE];
 WSABUF DataBuf;
 WSAOVERLAPPED Overlapped;
 DWORD BytesSEND;
 DWORD BytesRECV;
} SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
SOCKET ClientSocket;
DWORD EventTotal = 0;
HANDLE hThread[THREAD_COUNT];
WSAEVENT EventArray[WSAEVENT_COUNT];
LPSOCKET_INFORMATION g_pSIRecv = NULL;
LPSOCKET_INFORMATION g_pSISend = NULL;
void CloseClientSocket()
{
 if (INVALID_SOCKET != ClientSocket)
 {
  if (closesocket(ClientSocket) == 0)
   ClientSocket = INVALID_SOCKET;
 }
}
// Deliver recv operation.
int RecvData()
{
 if (NULL == g_pSIRecv || INVALID_SOCKET == ClientSocket)
  return FALSE;
 DWORD dwFlags = 0;
 g_pSIRecv->BytesRECV = 0;
 memset(g_pSIRecv->szIOBuffer, 0, sizeof(g_pSIRecv->szIOBuffer));
 g_pSIRecv->DataBuf.len = sizeof(g_pSIRecv->szIOBuffer)-1;
 int nRet = WSARecv(ClientSocket, &(g_pSIRecv->DataBuf), 1, &g_pSIRecv->BytesRECV, &dwFlags, &(g_pSIRecv->Overlapped), NULL);
 if (nRet == SOCKET_ERROR)
 {
  if (WSAGetLastError() != ERROR_IO_PENDING)
  {
   printf("WSARecv() failed with error %d/n", WSAGetLastError()); 
   CloseClientSocket();
   return FALSE;
  }
 }
 return TRUE;
}
// Deliver send operation.
BOOL SendData()
{
 if (NULL == g_pSIRecv || INVALID_SOCKET == ClientSocket)
  return FALSE;
 g_pSISend->BytesSEND = 0;
 strcpy(g_pSISend->szIOBuffer, "this is client data.");
 g_pSISend->DataBuf.len = strlen(g_pSISend->szIOBuffer);
 int nRet = WSASend(ClientSocket, &(g_pSISend->DataBuf), 1, &g_pSISend->BytesSEND, 0, &(g_pSISend-&g
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值