前言
在之前的回射程式中,實現了字串的傳遞與回射。幸運的是,字串的傳遞不用擔心不同計算機型別的大小端匹配問題,然而,如果傳遞二進位制資料,這就是一個要好好考慮的問題。在客戶端和伺服器使用不同的位元組序格式的情況下傳遞二進位制資料,會導致異常。此外,客戶和伺服器表示整型的位數不同也可能導致傳遞整型異常。
一個典型的錯誤示例( 回射程式中客戶端的事務函式 )
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. 顯式定義所支援資料型別的二進位制格式( 位數,大端或小端位元組序 )