網路大數運算之傳輸表示式和結果

2021-07-22 06:20:35 字數 2256 閱讀 9127

客戶端每次可以傳送乙個表示式到客戶端,客戶端解析該表示式字串,進行相應的運算結果求解。客戶端表示式傳輸採用結構體,結構體定義如下:

typedefstruct nodeexpression;
由於使用tcp協議進行傳輸,採用send()傳送字元流,需要對結構體指標轉化為char*,傳送乙個字元流。但因為結構體內存對齊原因,兩個變數之間可能存在空白區,這樣會造成服務端在解析該字元流的時候,會出現亂碼的情況。因此使用#pragma pack(1)將對齊的位元組數為1位元組,這樣轉化為字元流時,每個變數是連續儲存的。服務端也需要定義相同的結構體接收該字元流。

1. 服務端

(1) 初始化監聽套接字和套接字位址,然後將監聽套接字與ip位址,埠進行繫結。然後監聽8888埠。

void bigintsocket::initbigintsocket() 

bzero(&bigintsocket::serveraddr, sizeof(bigintsocket::serveraddr));

bigintsocket::serveraddr.sin_family = af_inet;

bigintsocket::serveraddr.sin_port = htons(8888);

bigintsocket::serveraddr.sin_addr.s_addr = inet_addr("192.168.59.154");

}void bigintsocket::bind()

}void bigintsocket::listen()

(2) 使用accept()等待客戶端的連線。

int bigintsocket::accept()
(3) 接收字元流,對exp結構體成員進行賦值。使用datalength1和datalength2統計每次接收data1和data2的字元個數。每次接收時需要對datalength1和datalength2初始化為0,防止同乙個客戶端多次請求,造成字元長度的累加,使得結果錯誤。

void bigintsocket::recv()
(4) 對表示式進行計算。表示式儲存在服務端的exp結構體中,初始化bigint的兩個物件b1和b2,b1和b2成員為seqlist,然後將data1和data2 使用push_back存放到seqlist中。由於recvbuf中存的是字元,所以需要減去字元0。然後根據exp.opera選擇相應的表示式進行(這裡只列舉了簡單的加、減、乘、除的運算)。計算完畢後,將計算結果b3複製到sendbuf緩衝區中。

void bigintsocket::processing() 

j = 0;

memset(sendbuf, 0, 2 * max_buf);

for (i = b3.size() - 1; i >= 1; --i)

sendbuf[j++] = b3[i] + '0'; // 轉化為字元

cout << sendbuf << endl;

}

(5) 傳送字元流到客戶端。

void bigintsocket::send()
1. 客戶端(1) 初始化套接字位址。

void bigintsocket::initbigintsocket()
(2) 傳送連線請求,與服務端建立連線。

void bigintsocket::connect() 

}

(3) 傳送表示式字元流

void bigintsocket::send(const char* big1, const char* opera, const char* big2) 

if ((len = send(connectsocket, (char*)&exp, sizeof(exp), 0)) < 0)

err_sys("send error");

}

(4) 接收計算結果

JavaScript之表示式和運算子

型別列表示期望的運算元型別,以及運算子結果型別。lval 表示左值。運算子操作an 型別 前 後增量r1 lval num 前 後減量r1 lval num 求反 r1num num 轉換為數字r1 num num 按位求反r1 int int 邏輯非r1 bool bool delete 刪除屬性...

運算子和表示式

運算子 1.算術運算子 定義 int i 2 1 i i 是在 使用完畢之後 2 i i 是在 之後使用 3 i i 是 3 3 是形成運算子的 4 函式是從右邊開始傳參,其中,為結束標誌 例子1 func i i i i,i 6,5,4,i,2 i最後是 7 6 5 4 7 2 例子2 i i i...

運算子和表示式

有些運算子需要兩個運算元,使用形式為 運算元 運算子 運算元,這樣的運算子就叫做二元運算子或雙目運算子,只需要乙個運算元的運算子叫做一元運算子或單目運算子。運算子具有優先順序和結合性。如果乙個表示式中有多個運算子則先進行優先順序高的運算,後進行優先順序低的運算。結合性就是指當乙個運算元左邊和右邊的運...