我們程式設計師所寫的解決我們實際問題滿足日常需求的網路程式都是在應用層,應用層是應用的,傳輸層是進行傳輸的,並不負責應用。
網路版計算器
我們需要實現乙個伺服器版的加法器,我們需要客戶端把要計算的兩個加數發過去,然後由伺服器進行計算,最後再把結果返回給客戶端
我們有兩種約定方案:
約定方案1:客戶端傳送乙個形如「1+1」的字串,這兩個字串中有兩個運算元,都是整形,兩個數字之間會有乙個字元是運算子,運算子只能是+,數字和運算子之間沒有空格;
約定方案2:定義結構體來表示我們需要互動的資訊,傳送資料時將這個結構體按照乙個規則看成乙個二進位製流,接收到資料時再按照相同的規則將它轉換回結構體,即把兩個字串變成乙個字串叫做序列化(方便傳送),傳送到對端將1個字串拆成2個字串叫做反序列化(方便接收)。
接下來我們實現乙個網路版計算器
先實現協議protocol.hpp:
#pragma once
#include #include #include #include #include #include #include #include using namespace std;
struct request
;struct response
;
這個就是定義約定,也就是協議,將運算元和運算子封裝進乙個結構體request,將最終的結果和是否計算成功的狀態封裝進乙個結構體response;
然後實現服務端server.cc
#include "protocol.hpp"
void* routine(void* arg)
; switch(rq.op)
else
rsp.result=rq.x/rq.y;
break;
case '%':
if(0==rq.y)
else
rsp.result=rq.x%rq.y;
break;
default:
rsp.status=3;
break;
}send(sock,&rsp,sizeof(rsp),0);
}else if(s==0)//對端將鏈結關閉
左邊的伺服器端收到請求行(get / http/1.1是請求行)帶乙個空行,右邊客戶端得到響應行(http/1.0 200 ok),響應報頭資訊。
在同乙個區域網下,可以使用手機瀏覽器來進行測試,輸入主機的ip位址+埠號即可得到。
網路基礎 應用層
應用層 解決如何使用 響應狀態碼 http常見header content type 資料型別 text html等 content length body的 長度 host 客戶端告知伺服器,所請求的資源是在哪個主機的哪個端 口上 user agent 宣告 使用者的作業系統和瀏覽器版本資訊 re...
網路基礎二之應用層
1.套接字 也就是我們通常所說的 如 1 帶層次的檔案路徑又稱為訪問資源 2 查詢字串又稱為引數 3 埠號與名稱對等,所以埠號一般省略。3.http格式 空行 將報頭和有效載荷 正文 進行分離 4.http方法 1 get方法 獲取資源,傳參在url中,不安全,並且長度有限 2 post方法 傳參在...
網路基礎 應用層(HTTP協議)
我們寫的解決我們實際問題的網路程式都是在應用層。今天我們詳細來了解一下應用層的http協議。協議就是一種約定,socket apide 介面,在讀寫資料時,都是按字串的方式來傳送接收的。如果我們要傳輸一些結構化的資料怎麼辦呢?我們可以約定 定義乙個結構體來標識我們需要互動的資訊,傳送資料時將這個結構...