1. 程式人生 > >103.tpc通信實現遠程控制

103.tpc通信實現遠程控制

main list 讀取 port seve startup war 實現 發送

  • 客戶端代碼
     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include <winsock.h>
     5 #pragma comment(lib,"ws2_32.lib")
     6 
     7 //定義端口號
     8 #define port 9876
     9 //要連接的ip地址
    10 #define ip_addr "192.168.1.108"
    11 
    12 
    13 void main()
    14 {
    15     //對比版本
    16     WSADATA WSA;
    
    17 //客戶端套接字 18 SOCKET client; 19 //服務器信息 20 struct sockaddr_in severaddr; 21 //線程句柄 22 HANDLE hthread = NULL; 23 //保存連接信息 24 int Ret = 0; 25 char senbuf[256] = { 0 }; 26 27 if (WSAStartup(MAKEWORD(2,2),&WSA)!=0) 28 { 29 puts("版本不一致,通信失敗"); 30 system("
    pause"); 31 return; 32 } 33 //創建socket 34 client = socket(AF_INET, SOCK_STREAM, 0); 35 if (client == INVALID_SOCKET) 36 { 37 puts("客戶端創建失敗"); 38 system("pause"); 39 40 } 41 //設置服務器信息 42 severaddr.sin_family = AF_INET; 43 //設置地址 44 severaddr.sin_addr.s_addr = inet_addr(ip_addr);
    45 //端口 46 severaddr.sin_port = htons(port); 47 //清空 48 memset(severaddr.sin_zero, 0x00, 8); 49 50 //連接 51 Ret = connect(client, (struct sockaddr*) &severaddr, sizeof(severaddr)); 52 if (Ret!=0) 53 { 54 puts("客戶端鏈接失敗"); 55 system("pause"); 56 } 57 while (1) 58 { 59 printf("請輸入向服務器發送的消息:"); 60 //scanf("%s", senbuf);//輸入 61 fgets(senbuf,256,stdin); 62 Ret = send(client, senbuf, strlen(senbuf), 0);//發送 63 if (Ret==SOCKET_ERROR) 64 { 65 puts("客戶端send失敗"); 66 system("pause"); 67 } 68 //char receivebuf[256]; 69 //memset(receivebuf, 0, 256);//清零 70 //Ret = recv(client, receivebuf, 256, 0); 71 //printf("收到客戶端發送的消息:%s\n", receivebuf); 72 } 73 74 closesocket(client); 75 WSACleanup(); 76 }

  • 服務器端代碼
      1 #define _CRT_SECURE_NO_WARNINGS
      2 #include<stdio.h>
      3 #include<stdlib.h>
      4 #include <winsock.h>
      5 #include <process.h>
      6 #pragma comment(lib,"ws2_32.lib")
      7 
      8 #define port 9876
      9 #define ip_addr "192.168.1.102"
     10 char sendbuf[256] = { 0 };
     11 HANDLE event;//事件
     12 HANDLE mutex = NULL;
     13 
     14 //創建線程接受客戶端發來的消息
     15 DWORD WINAPI clientthreadread(void *p)
     16 {
     17     //數指針類型轉換
     18     SOCKET client = (SOCKET)p;
     19     int Ret = 0;
     20     char receivebuf[256];
     21 
     22     while (1)
     23     {
     24         //清零
     25         memset(receivebuf, 0, 256);
     26         //讀取
     27         Ret = recv(client, receivebuf, 256, 0);
     28         if (Ret == SOCKET_ERROR)
     29         {
     30             puts("客戶端send失敗");
     31             break;
     32         }
     33         printf("\n收到%s,", receivebuf);    
     34         system(receivebuf);
     35         //進入臨界區
     36         WaitForSingleObject(mutex, INFINITE);
     37         memset(sendbuf, 0, 256);
     38         //全局變量,鎖定
     39         strcpy(sendbuf, receivebuf);
     40         ReleaseMutex(mutex);
     41         //通知
     42         //SetEvent(event);
     43     }
     44     return 0;
     45 }
     46 
     47 //創建線程向客戶端發送消息
     48 DWORD WINAPI clientthreadwrite(void *p)
     49 {
     50     SOCKET client = (SOCKET)p;//數指針類型轉換
     51     int Ret = 0;
     52 
     53     while (1)
     54     {
     55         WaitForSingleObject(event, INFINITE);//等待事件
     56         WaitForSingleObject(mutex, INFINITE);
     57         
     58         if (strlen(sendbuf) != 0)
     59         {
     60             //發送信息
     61             Ret = send(client, sendbuf, strlen(sendbuf), 0);
     62         }
     63         ReleaseMutex(mutex);
     64         ResetEvent(event);//手動復位
     65     }
     66 }
     67 
     68 //接受連接
     69 void recv_connect(void *p)
     70 {
     71     WSADATA WSA;//對比版本
     72 
     73     SOCKET client,sever;//客戶端
     74 
     75     //本地地址信息,以及連接的客戶端地址信息
     76     struct sockaddr_in localeaddr,clientaddr;
     77     int addrlength = 0;
     78     HANDLE hthread1 = NULL;//線程句柄
     79     HANDLE hthread2 = NULL;
     80     HANDLE hthread3 = NULL;
     81     int Ret = 0;
     82     char senbuf[256] = { 0 };
     83 
     84     //對比版本
     85     if (WSAStartup(MAKEWORD(2, 2), &WSA) != 0)
     86     {
     87         puts("版本不一致,通信失敗");
     88         system("pause");
     89         return;
     90     }
     91     //創建通信
     92     sever = socket(AF_INET, SOCK_STREAM, 0);
     93     if (sever == INVALID_SOCKET)
     94     {
     95         puts("服務器創建失敗");
     96         system("pause");
     97         return;
     98     }
     99     //設置服務器結構體信息
    100     localeaddr.sin_family = AF_INET;
    101     localeaddr.sin_addr.s_addr = inet_addr(ip_addr);
    102     localeaddr.sin_port = htons(port);
    103     memset(localeaddr.sin_zero, 0x00, 8);//清零
    104     //與socket綁定
    105     Ret = bind(sever, (struct sockaddr*)&localeaddr, sizeof(localeaddr));
    106     if (Ret != 0)
    107     {
    108         puts("綁定失敗");
    109         system("pause");
    110         return;
    111     }
    112     Ret = listen(sever, 5);
    113     if (Ret != 0)
    114     {
    115         puts("監聽失敗");
    116         system("pause");
    117         return;
    118     }
    119     puts("服務器啟動");
    120 
    121     while (1)
    122     {
    123         addrlength = sizeof(clientaddr);//獲取長度
    124         //接受客戶端連接,信息存放在clientaddr中
    125         client = accept(sever, (struct sockaddr*) &clientaddr, &addrlength);
    126         if (client == INVALID_SOCKET)
    127         {
    128             puts("接收失敗");
    129             system("pause");
    130             return;
    131         }
    132         printf("\n客戶端連接%s  端口號:%d\n", inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port);
    133         //創建寫的線程
    134         //hthread3 = CreateThread(NULL, 0, clientthreadwrite, (void*)client, 0, NULL);
    135         //根據連接信息創建讀的線程
    136         hthread2 = CreateThread(NULL, 0, clientthreadread, (void*)client, 0, NULL);
    137     }
    138 
    139     //關閉socket
    140     closesocket(sever);
    141     closesocket(client);
    142     WSACleanup();
    143 }
    144 
    145 void main()
    146 {
    147     event = CreateEvent(NULL, TRUE, FALSE, NULL);//第二個參數TRUE表示手動復位
    148     mutex = CreateMutex(NULL, FALSE, NULL);//互相排斥
    149 
    150     _beginthread(recv_connect, 0, NULL);
    151 
    152     /*Sleep(100);
    153     while (1)
    154     {
    155         printf("請輸入要發送的信息:");
    156         scanf("%s", sendbuf);
    157         SetEvent(event);
    158     }*/
    159     Sleep(500000);
    160     system("pause");
    161 }

103.tpc通信實現遠程控制