zoukankan      html  css  js  c++  java
  • windows异步通知I/O模型

    回声服务器端:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <WinSock2.h>
      4 
      5 #define BUF_SIZE 1024
      6 void ErrorHandling(char *message);
      7 void CompressSockets(SOCKET hSockArr[], int idx, int total);
      8 void CompressEvents(WSAEVENT hEventArr[], int idx, int total);
      9 
     10 int main(int argc, char *argv[])
     11 {
     12     if (argc != 2) {
     13         printf("Usage : %s <port>
    ", argv[0]);
     14         exit(1);
     15     }
     16 
     17     WSADATA wsaData;
     18     SOCKET hServSock, hClntSock;
     19     SOCKADDR_IN servAdr, clntAdr;
     20     
     21     SOCKET hSockArr[WSA_MAXIMUM_WAIT_EVENTS];
     22     WSAEVENT hEventArr[WSA_MAXIMUM_WAIT_EVENTS];
     23     WSAEVENT newEvent;
     24     WSANETWORKEVENTS netEvents;
     25 
     26     int numOfClntSock = 0;
     27     int strLen;
     28     int posInfo, startIdx;
     29     int clntAdrLen;
     30     char msg[BUF_SIZE];
     31 
     32     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
     33         ErrorHandling("WSAStartup() error.");
     34 
     35     hServSock = socket(PF_INET, SOCK_STREAM, 0);
     36     if (hServSock == INVALID_SOCKET)
     37         ErrorHandling("socket() error.");
     38 
     39     memset(&servAdr, 0, sizeof(servAdr));
     40     servAdr.sin_family = AF_INET;
     41     servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
     42     servAdr.sin_port = htons(atoi(argv[1]));
     43 
     44     if (bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR)
     45         ErrorHandling("bind() error.");
     46     if (listen(hServSock, 5) == SOCKET_ERROR)
     47         ErrorHandling("listen() error.");
     48 
     49     newEvent = WSACreateEvent();
     50     if (WSAEventSelect(hServSock, newEvent, FD_ACCEPT) == SOCKET_ERROR)
     51         ErrorHandling("WSAEventSelect() error.");
     52 
     53     hSockArr[numOfClntSock] = hServSock;
     54     hEventArr[numOfClntSock] = newEvent;
     55     numOfClntSock++;
     56     printf("Server start...
    ");
     57     while (1)
     58     {
     59         posInfo = WSAWaitForMultipleEvents(numOfClntSock, hEventArr, FALSE, WSA_INFINITE, FALSE);
     60         startIdx = posInfo - WSA_WAIT_EVENT_0;
     61         for (int i = startIdx; i < numOfClntSock; i++){
     62             int sigEventIdx = WSAWaitForMultipleEvents(1, &hEventArr[i], TRUE, 0, FALSE);
     63             if (sigEventIdx == WSA_WAIT_FAILED || sigEventIdx == WSA_WAIT_TIMEOUT){
     64                 continue;
     65             }
     66             else{
     67                 sigEventIdx = i;
     68                 WSAEnumNetworkEvents(hSockArr[sigEventIdx], hEventArr[sigEventIdx], &netEvents);
     69                 if (netEvents.lNetworkEvents & FD_ACCEPT){ // 客户端请求连接
     70                     if (netEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
     71                     {
     72                         printf("Accept error.
    ");
     73                         break;
     74                     }
     75                     clntAdrLen = sizeof(clntAdr);
     76                     hClntSock = accept(hSockArr[sigEventIdx], (SOCKADDR*)&clntAdr, &clntAdrLen);
     77                     newEvent = WSACreateEvent();
     78                     WSAEventSelect(hClntSock, newEvent, FD_READ | FD_CLOSE);
     79 
     80                     hEventArr[numOfClntSock] = newEvent;
     81                     hSockArr[numOfClntSock] = hClntSock;
     82                     numOfClntSock++;
     83                     printf("connected new client...
    ");
     84                 }
     85                 if (netEvents.lNetworkEvents & FD_READ){ // 接收数据
     86                     if (netEvents.iErrorCode[FD_READ_BIT] != 0)
     87                     {
     88                         printf("Read error
    ");
     89                         break;
     90                     }
     91                     strLen = recv(hSockArr[sigEventIdx], msg, sizeof(msg), 0);
     92                     send(hSockArr[sigEventIdx], msg, strLen, 0);
     93                 }
     94                 if (netEvents.lNetworkEvents & FD_CLOSE){ // 断开连接
     95                     if (netEvents.iErrorCode[FD_CLOSE_BIT] != 0)
     96                     {
     97                         printf("Close Error.
    ");
     98                         break;
     99                     }
    100                     WSACloseEvent(hEventArr[sigEventIdx]);
    101                     closesocket(hSockArr[sigEventIdx]);
    102 
    103                     numOfClntSock--;
    104                     CompressSockets(hSockArr, sigEventIdx, numOfClntSock);
    105                     CompressEvents(hEventArr, sigEventIdx, numOfClntSock);
    106                 }
    107             }
    108         }
    109     }
    110     WSACleanup();
    111     return 0;
    112 }
    113 
    114 void ErrorHandling(char *message) {
    115     fputs(message, stderr);
    116     fputc('
    ', stderr);
    117 }
    118 
    119 void CompressSockets(SOCKET hSockArr[], int idx, int total){
    120     for (int i = idx; i < total; i++)
    121         hSockArr[i] = hSockArr[i + 1];
    122 }
    123 
    124 void CompressEvents(WSAEVENT hEventArr[], int idx, int total){
    125     for (int i = idx; i < total; i++)
    126         hEventArr[i] = hEventArr[i + 1];
    127 }
    View Code

    客户端:

     1 #pragma warning(disable:4996)
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <string.h>
     5 #include <winsock2.h>
     6 
     7 #define BUF_SIZE 1024
     8 void ErrorHandling(char *message);
     9 
    10 int main(int argc, char* argv[]) {
    11     if (argc != 3) {
    12         printf("Usage : %s <IP> <port>
    ", argv[0]);
    13         exit(1);
    14     }
    15 
    16     WSADATA wsaData;
    17     SOCKET sock;
    18     SOCKADDR_IN serverAddr;
    19     char message[BUF_SIZE];
    20     int sLen, recvLen;
    21 
    22     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    23         ErrorHandling("WSAStartup() error");
    24 
    25     sock = socket(PF_INET, SOCK_STREAM, 0);
    26     if (sock == INVALID_SOCKET)
    27         ErrorHandling("socket() error");
    28 
    29     memset(&serverAddr, 0, sizeof(serverAddr));
    30     serverAddr.sin_family = AF_INET;
    31     serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
    32     serverAddr.sin_port = htons(atoi(argv[2]));
    33 
    34     if (connect(sock, (SOCKADDR*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR)
    35         ErrorHandling("connect() error");
    36     else
    37         printf("Connected.......
    ");
    38     while (1)
    39     {
    40         fputs("Input message(Q to quit):", stdout);
    41         fgets(message, BUF_SIZE, stdin);
    42         if (!strcmp(message, "q
    ") || !strcmp(message, "Q
    "))
    43             break;
    44         sLen = send(sock, message, strlen(message), 0);
    45         recvLen = 0;
    46         while (recvLen < sLen) {
    47             int cnt = recv(sock, message, BUF_SIZE - 1, 0);
    48             if (cnt == -1)
    49                 ErrorHandling("ercv() error");
    50             recvLen += cnt;
    51         }
    52         message[recvLen] = 0;
    53         printf("Message from server: %s
    ", message);
    54     }
    55     closesocket(sock);
    56     WSACleanup();
    57     return 0;
    58 }
    59 
    60 void ErrorHandling(char *message) {
    61     fputs(message, stderr);
    62     fputc('
    ', stderr);
    63 }
    View Code
  • 相关阅读:
    使用delphi 开发多层应用(十)安全访问服务器
    使用delphi 开发多层应用(十三)使用Basic4android 直接访问kbmMW server
    使用delphi 开发多层应用(十一)使用kbmMW 开发webserver
    basic4android 开发教程翻译(八)使用ListView
    使用delphi 连接国产数据库:达梦
    kbmMW 4.01.00 Beta 1发布了
    解决 ie 下 javascript 设置 table.tBodies.innerHTML 无法设置的问题
    用vs2010 把 vcf 转成 csv,再转入Nokia
    GAC 与 引用 程序集路径
    sqlserver 函数 之 进制转换
  • 原文地址:https://www.cnblogs.com/ACGame/p/10632033.html
Copyright © 2011-2022 走看看