第十五篇:關於TCP通訊程式中資料的傳遞格式

穆晨發表於2017-05-19

前言

       在之前的回射程式中,實現了字串的傳遞與回射。幸運的是,字串的傳遞不用擔心不同計算機型別的大小端匹配問題,然而,如果傳遞二進位制資料,這就是一個要好好考慮的問題。在客戶端和伺服器使用不同的位元組序格式的情況下傳遞二進位制資料,會導致異常。此外,客戶和伺服器表示整型的位數不同也可能導致傳遞整型異常。

一個典型的錯誤示例( 回射程式中客戶端的事務函式 )

 1 #include    "unp.h"
 2 
 3 struct args {
 4   long    arg1;
 5   long    arg2;
 6 };
 7 
 8 struct result {
 9   long    sum;
10 };
11 
12 void
13 str_cli(FILE *fp, int sockfd)
14 {
15     char            sendline[MAXLINE];
16     struct args        args;
17     struct result    result;
18 
19     while (Fgets(sendline, MAXLINE, fp) != NULL) {
20 
21         if (sscanf(sendline, "%ld%ld", &args.arg1, &args.arg2) != 2) {
22             printf("invalid input: %s", sendline);
23             continue;
24         }
25         /*
26          * 寫入結構體( 二進位制資料 )
27         */
28         Writen(sockfd, &args, sizeof(args));
29 
30         if (Readn(sockfd, &result, sizeof(result)) == 0)
31             err_quit("str_cli: server terminated prematurely");
32 
33         printf("%ld\n", result.sum);
34     }
35 }

錯誤原因

       無論是用結構體或者用整型作為資料載體,當通訊程式用於不同體系的計算機時,都可能會出現問題( 比如整型位數,二進位制資料的大小端規範 )。

解決方法

       1. 把所有的資料都作為字串傳遞則沒有任何問題

       2. 顯式定義所支援資料型別的二進位制格式( 位數,大端或小端位元組序 )

相關文章