《UNIX網路程式設計 卷2》 筆記 位元組流與訊息

2021-08-07 18:23:27 字數 1380 閱讀 4695

目前我們給出的管道和fifo的例子通訊雙方使用的都是位元組流i/o模型,程式不對它作任何解釋。舉個例子,如果乙個程序從fifo收到100位元組資料,它不知道這100位元組資料是乙個程序傳送的還是多個程序傳送的。

如何區分位元組流是哪個程序傳送的?

有種常用的技巧就是將資料封裝在一條訊息(可以理解為帶邊界資訊的位元組流)裡。訊息包括訊息頭和資料,通訊雙方事先約定好訊息的格式,就可以通過訊息通訊了。比如為解決上面的問題,雙方可以約定在訊息頭里包含程序id號,這樣就可以區分位元組流是哪個程序傳送的了。

下面我們修改管道這一節中的**,使得客戶和伺服器使用訊息通訊。

首先,我們需要定義乙個訊息的格式。

#define pipe_buf 5120

/*訊息包含的最大資料量*/

#define maxmesgdata (pipe_buf - 2 * sizeof(long))

/*訊息頭的長度*/

#define mesghdrsize (sizeof(struct mymesg) - maxmesgdata)

struct mymesg ;

本例中,我們定義乙個訊息的訊息頭包含訊息型別和資料長度,整個訊息的最大長度為5120位元組。訊息裡的資料長度為0表明本次通訊結束,為1表示正常的資料。本例實際用不到訊息型別,所以**中訊息型別一直為1,這樣使用主要是告訴讀者這種包含資料長度和訊息型別的訊息頭是非常通用的。

讀訊息和傳送訊息的函式**如下:

ssize_t

mesg_send(int fd, struct mymesg *mptr)

ssize_t

mesg_recv(int fd, struct mymesg *mptr)

/*包裹函式*/

ssize_t

mesg_send(int fd, struct mymesg *mptr)

ssize_t

mesg_recv(int fd, struct mymesg *mptr)

傳送訊息時,我們填充訊息型別和資料長度,新增資料,然後呼叫mesg_send傳送。

修改後的client函式**如下:

void client(int readfd, int writefd)

修改後的server函式**如下:

void server(int readfd, int writefd)

else

fclose(fp);

} /*傳送乙個資料長度為0的訊息,表示傳送結束*/

mesg.mesg_len = 0;

mesg_send(writefd, &mesg);

}

《UNIX網路程式設計 卷2》 筆記 管道

管道是最初的unix ipc形式,它的侷限性在於沒有名字,只能在有親緣關係的程序間使用。後來,fifo出現了,fifo也稱為有名管道。管道和fifo都使用read和write函式訪問。include int pipe int fd 2 管道由pipe函式建立,返回兩個描述符 fd 0 用來讀,fd ...

《UNIX網路程式設計 卷1》 筆記 UNIX域協議

unix域協議並不是乙個實際的協議族,而是在單個主機上客戶程序和伺服器程序之間通訊的一種方法。unix域使用的套接字結構如下 struct sockaddr un int main int argc,char argv 執行結果如下 可以看到繫結的路徑名 tmp 123 現在是乙個套接字檔案。uni...

《UNIX網路程式設計 卷1》 筆記 高階I O函式

本節我們關注稱為 高階i o 的各個函式和技術。首先是在i o操作上設定超時。在涉及套接字的i o操作上設定超時的方法有以下3種 1.呼叫alarm函式,在定時時間超時產生sigalrm訊號,打斷i o操作。首先我們給出要使用的signal1函式的實現,這個函式不是系統呼叫signal的包裹函式,而...