zoukankan      html  css  js  c++  java
  • 学习win32网络编程

    结构体列表:

    • WSADATA
    • SOCKET
    • SOCKADDR_IN

    函数列表:

    • WSAStartup
    • socket
    • htonl
    • htons
    • bind
    • listen
    • accept
    • send
    • recv
    • closesocket

    代码:

      1 #pragma comment(lib, "wsock32.lib")
      2 #include <WinSock2.h>
      3 #include <stdlib.h>
      4 #include <windows.h>
      5 
      6 /***
      7 * @author:zanzan101
      8 */
      9 
     10 static HANDLE event_server = CreateEvent(0, 0, 0, "server_event");
     11 static HANDLE event_client = CreateEvent(0, 0, 0, "client_event");
     12 static HANDLE event_end = CreateEvent(0, 0, 0, "end_event");
     13 
     14 class Thread
     15 {
     16 private:
     17     HANDLE thread;
     18 public:
     19     Thread(int(*func)(int* para), void* para)    // 故意简化了参数,但这并不是一个规范的做法
     20     {
     21         thread = NULL;
     22 
     23         // 创建一个挂起的进程
     24         thread = CreateThread(0, 0, reinterpret_cast<DWORD(CALLBACK*)(void*)>(func), para, CREATE_SUSPENDED, 0);
     25     }
     26     ~Thread()
     27     {
     28         CloseHandle(thread);
     29     }
     30     void resume()
     31     {
     32         ResumeThread(thread);
     33     }
     34     void suspend()
     35     {
     36         SuspendThread(thread);
     37     }
     38     void terminate()
     39     {
     40         TerminateThread(thread, 0);
     41     }
     42     
     43 };
     44 
     45 int server_func(int* para)
     46 {
     47     int wsa_res = 0;
     48     // 打开
     49     WSADATA wsa_data;
     50     if(!(wsa_res = WSAStartup(0x0101, &wsa_data)))
     51         printf("server_%d	打开成功!
    ", *para);
     52     else
     53     {
     54         printf("server_%d	ERROR:%d
    ", *para, wsa_res - WSABASEERR);
     55         return -1;
     56     }
     57 
     58     // 创建套接字
     59     SOCKET socket_server = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     60     SOCKADDR_IN addr_server;
     61     SOCKADDR_IN addr_client;
     62 
     63     addr_server.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
     64     addr_server.sin_family=AF_INET;
     65     addr_server.sin_port=htons(6666);
     66 
     67     // 将套接字与端口号绑定
     68     bind(socket_server, (SOCKADDR*)&addr_server, sizeof(SOCKADDR));
     69 
     70     // 监听端口
     71     listen(socket_server, SOMAXCONN);
     72 
     73 
     74     int len = sizeof(SOCKADDR_IN);
     75 
     76     printf("server 准备完毕...
    ");
     77     // 设置信号,通知client
     78     SetEvent(event_server);
     79 
     80     printf("server在等待client...
    ");
     81 
     82 
     83     while(WaitForSingleObject(event_client, 0) != 0)
     84     {
     85         char recv_buf[100];
     86         char send_buf[100];
     87 
     88         //////////////////////////////////////////////////////////////////////////
     89 
     90         SOCKET socket_connect=accept(socket_server,(SOCKADDR*)&addr_client,&len);
     91         int bytes = recv(socket_connect, recv_buf, 100, 0);
     92         recv_buf[bytes] = 0;
     93         int num = atoi(recv_buf);
     94         if(bytes > 0 && -1 != num)
     95             printf("server收到:%d
    ",num);
     96         else if(-1 != num)
     97             printf("server什么也没收到
    ");
     98         if(-1 != num)
     99         {
    100             sprintf(send_buf,"%d的平方是:%d
    ",num, num*num);
    101             send(socket_connect,send_buf,strlen(send_buf)+1,0);
    102         }
    103         closesocket(socket_connect);
    104 
    105         //////////////////////////////////////////////////////////////////////////
    106     }
    107 
    108     if(!(wsa_res = WSACleanup()))
    109         printf("server_%d	关闭成功!
    ", *para);
    110     else
    111     {
    112         printf("server_%d	ERROR:%d
    ", *para, wsa_res - WSABASEERR);
    113         return -1;
    114     }
    115     SetEvent(event_end);
    116     return 0;
    117 }
    118 
    119 int client_func(int* para)
    120 {
    121     printf("client在等待server运行...
    ");
    122     // 等待server运行
    123     while(WaitForSingleObject(event_server, 0) != 0)
    124         Sleep(100);// 100ms的响应时间
    125 
    126     int wsa_res = 0;
    127     WSADATA wsa_data;
    128     if(!(wsa_res = WSAStartup(0x0101, &wsa_data)))
    129         printf("client_%d	打开成功!
    ", *para);
    130     else
    131     {
    132         printf("client_%d	ERROR:%d
    ", *para, wsa_res - WSABASEERR);
    133         SetEvent(event_client);
    134         return -1;
    135     }
    136     printf("client正在运行...
    ");
    137 
    138     while(true)
    139     {
    140         int num;
    141         scanf("%d", &num);
    142 
    143         if(-1 == num)
    144         {
    145             printf("client结束...
    ");
    146             SetEvent(event_client);
    147         }
    148 
    149         char recv_buf[100];
    150         char send_buf[100];
    151 
    152         itoa(num, send_buf, 10);
    153 
    154         //////////////////////////////////////////////////////////////////////////
    155 
    156         SOCKET socket_client=socket(AF_INET,SOCK_STREAM,0);
    157         SOCKADDR_IN addr_server;
    158         addr_server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    159         addr_server.sin_family=AF_INET;
    160         addr_server.sin_port=htons(6666);
    161         connect(socket_client,(SOCKADDR*)&addr_server,sizeof(SOCKADDR));
    162         send(socket_client, send_buf,strlen(send_buf), 0);
    163         if(0 < recv(socket_client,recv_buf,100,0) && -1 != num)
    164             printf("client收到:%s
    ",recv_buf);
    165         else if( -1 != num)
    166             printf("client什么也没有收到。。。
    ");
    167 
    168         closesocket(socket_client);
    169 
    170         if(-1 == num)
    171             break;
    172 
    173         //////////////////////////////////////////////////////////////////////////
    174     }
    175     if(!(wsa_res = WSACleanup()))
    176         printf("client_%d	关闭成功!
    ", *para);
    177     else
    178     {
    179         printf("client_%d	ERROR:%d
    ", *para, wsa_res - WSABASEERR);        
    180         SetEvent(event_client);
    181 
    182         return -1;
    183     }        
    184 
    185     return 0;
    186 }
    187 
    188 int main()
    189 {
    190     int i = 0;
    191     int j = 1;
    192     
    193     // 重置信号,默认状态下不需要重置
    194     //ResetEvent(event_server);
    195     //ResetEvent(event_client);
    196     //ResetEvent(event_end);
    197 
    198     Thread server_thread(server_func, &i);
    199     Thread client_thread(client_func, &j);
    200     server_thread.resume();    
    201     client_thread.resume();
    202     
    203     // 等待server结束
    204     while(WaitForSingleObject(event_end, 0) != 0)
    205         Sleep(100);// 100ms的响应时间
    206     printf("全部结束!
    ");
    207 
    208     server_thread.terminate();
    209     client_thread.terminate();
    210     
    211     system("pause");
    212     return 0;
    213 }

    输出结果:

    client在等待server运行...
    server_0        打开成功!
    server 准备完毕...
    server在等待client...
    client_1        打开成功!
    client正在运行...
    2
    server收到:2
    client收到:2的平方是:4
    
    32
    server收到:32
    client收到:32的平方是:1024
    
    -1
    client结束...
    server_0        关闭成功!
    client_1        关闭成功!
    全部结束!
    请按任意键继续. . .
  • 相关阅读:
    ssm框架实现多条件查询分页(模拟百度算法)
    spring与mybatis的整合
    spring入门
    mybatis foreach标签用法
    图书借阅系统简易异步分页源码
    Jquery常用选择器
    mvc
    Java连接数据库 jdbc
    java学习线路
    Mybatis传递多个参数的几种方式
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3388790.html
Copyright © 2011-2022 走看看