第十三課:樹莓派搭建用戶端

2020-08-12 23:09:17

第一課:什麼是樹莓派
第二課:基於樹莓派的10個經典專案
第三課:購買您的第一個樹莓派
第四課:如何安裝樹莓派系統
第五課:樹莓派C語言程式設計手冊
第六課:樹莓派led控制
第七課:樹莓派按鍵控制
第八課:樹莓派PWM(脈寬調製)
第九課:樹莓派數碼管顯示
第十課:樹莓派如何讀取溫溼度感測器(dht11)數據
第十一課:樹莓派控制電機
第十二課:樹莓派搭建伺服器
上一節課,我們實現了伺服器,伺服器必須要有用戶端纔有意義,那麼這節課我們講解用戶端的實現方法。

實驗方法

我們這裏的實驗方法,非常簡單,就是開啓兩個終端,一個執行伺服器,另一個執行用戶端,就像這樣:
在这里插入图片描述
這個實驗,可以很快的驗證伺服器是不是OK,這樣再往其他用戶端擴充套件,比如用QT開發一個用戶端,或者用小程式開發一個用戶端,這樣你的精力就只需要集中在用戶端那邊了,因爲伺服器已經證明是沒有問題的,可以正常收到數據的。

用戶端的程式設計思路

建立一個用戶端,只需要2步:
1)建立通訊端
2)連線伺服器
然後就是發送數據給伺服器了。

1)建立通訊端

用戶端建立通訊端與伺服器是一樣的,呼叫socket函數,如下
int fd;
//第一步:建立通訊端
fd = socket(AF_INET,SOCK_STREAM,0);//使用ipv4地址族,TCP協定
跟伺服器一模一樣

2) 連線伺服器

//int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
連線伺服器,跟伺服器的bind函數很類似,其中:
第一個參數:
sockfd是socket函數的返回值,
第二個參數:
需要設定伺服器的IP地址和埠號,告訴程式,你要連到哪個伺服器。
第三個參數:
存放這個結構體指針所指向記憶體位元組大小,就是第二參數所佔空間的位元組大小。
返回值:
connect如果連線到伺服器成功,則返回0,失敗返回-1;

3)發送數據到伺服器

接下來,就可以通過write函數發送數據給伺服器了。

完整用戶端程式碼

pi@xiajiashan:~/pi-c$ cat -n client_tcp.c 
     1  #include <stdio.h>
     2  #include <sys/types.h>          /* See NOTES */
     3  #include <sys/socket.h>
     4  #include <stdlib.h>
     5  #include <fcntl.h>
     6  #include <unistd.h>
     7  #include <netinet/in.h>
     8  #include <arpa/inet.h>
     9  #include <stdlib.h>
    10  #include <string.h>
    11  //int socket(int domain, int type, int protocol);
    12  #define SERVER_IP "192.168.137.243"
    13  #define SERVER_PORT 8990
    14  int main(void)
    15  {
    16    int fd;
    17    //第一步:建立通訊端
    18    fd = socket(AF_INET,SOCK_STREAM,0);//使用ipv4地址族
    19    printf("fd = %d\n",fd);
    20    if(fd==-1)
    21    {
    22       perror("socket failed...");
    23       exit(-1);
    24    }
    25    //第二步:鏈接到伺服器
    26    //int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    27    int retval;
    28    struct sockaddr_in  serveraddr;//設定伺服器IP地址
    29    serveraddr.sin_family = AF_INET;//IPV4
    30    serveraddr.sin_port = htons(SERVER_PORT);//把主機地址轉爲網路地址
    31    //  in_addr_t inet_addr(const char *cp);
    32    serveraddr.sin_addr.s_addr = inet_addr(SERVER_IP);
    33    retval = connect(fd,(struct sockaddr*)&serveraddr, 16);
    34    printf("retval = %d\n",retval);
    35    if(retval==-1)
    36    {
    37      perror("connect failed...");
    38      close(fd);
    39      exit(-1);
    40    }else{
    41      printf("連線到伺服器(%s:%d)成功...\n",SERVER_IP,SERVER_PORT);
    42    }
    43    char buf[100]="";
    44    while(1)
    45    {
    46       printf("請輸入要發送給伺服器的數據(end結束):");
    47       fgets(buf,100,stdin);//從鍵盤獲取100個位元組存放到buf中
    48       retval = write(fd,buf,strlen(buf)-1);
    49       if(strncmp(buf,"end",3)==0) break;
    50       memset(buf,0,100);
    51    }
    52    close(fd);
    53    return 0;
    54  }
    55    
pi@xiajiashan:~/pi-c$ 

END

好了,用戶端就寫到這裏,接下來寫如何用QT開發用戶端。
如果覺得本部落格對你有幫助,就收藏吧!

第一課:什麼是樹莓派
第二課:基於樹莓派的10個經典專案
第三課:購買您的第一個樹莓派
第四課:如何安裝樹莓派系統
第五課:樹莓派C語言程式設計手冊
第六課:樹莓派led控制
第七課:樹莓派按鍵控制
第八課:樹莓派PWM(脈寬調製)
第九課:樹莓派數碼管顯示
第十課:樹莓派如何讀取溫溼度感測器(dht11)數據
第十一課:樹莓派控制電機
第十二課:樹莓派搭建伺服器