14 基於socket檔案的IPC

2021-06-25 11:33:00 字數 3145 閱讀 9666

一:兩種模型:

對等模型

c/s模型

補充(來自網上對兩種通訊協議的理解):

tcp(transmission control protocol,傳輸控制協議)是基於連線的協議,也就是說,

在正式收發資料前,必須和對方建立可靠的連線。乙個tcp連線必須要經過三次「對話」才

能建立起來,其中的過程非常複雜,我們這裡只做簡單、形象的介紹,你只要做到能夠理

解這個過程即可。我們來看看這三次對話的簡單過程:主機a向主機b發出連線請求資料

包:「我想給你發資料,可以嗎?」,這是第一次對話;主機b向主機a傳送同意連線和要

求同步(同步就是兩台主機乙個在傳送,乙個在接收,協調工作)的資料報:「可以,你什麼

時候發?」,這是第二次對話;主機a再發出乙個資料報確認主機b的要求同步:「我現在就

發,你接著吧!」,這是第三次對話。三次「對話」的目的是使資料報的傳送和接收同步,經

過三次「對話」之後,主機a才向主機b正式傳送資料。

udp(user data protocol,使用者資料報協議)是與tcp相對應的協議。它是面向非連線的協

議,它不與對方建立連線,而是直接就把資料報傳送過去!

udp適用於一次只傳送少量資料、對可靠性要求不高的應用環境。比如,我們經常使用「ping」命

令來測試兩台主機之間tcp/ip通訊是否正常,其實「ping」命令的原理就是向對方主機傳送udp資料報,

然後對方主機確認收到資料報,如果資料報是否到達的訊息及時反饋回來,那麼網路就是通的。例如,

在預設狀態下,一次「ping」操作傳送4個資料報(如圖2所示)。大家可以看到,傳送的資料報數量是4包,

收到的也是4包(因為對方主機收到後會發回乙個確認收到的資料報)。這充分說明了udp協議是面向非

連線的協議,沒有建立連線的過程。正因為udp協議沒有連線的過程,所以它的通訊效果高;但也正因

為如此,它的可靠性不如tcp協議高。qq就使用udp發訊息,因此有時會出現收不到訊息的情況。

二: 對等模型  ------------一般採用udp通訊方式

優點:通訊簡單缺點: 多個使用者通訊時多有不變。

1. 建立socket

int socket(int domain,  //  協議族型別  af_unix, af_inet

int type,  /// 支援資料格式:流sock_stream / 報文 sock_dgram

int protocol);// 支援的協議,建議為0

返回值:

成功: 返回檔案描述符

失敗: 返回-1

2. 繫結在位址上

int bind(int sockfd, /// socket描述符

const struct sockaddr *addr,/// 繫結位址

socklen_t addrlen);

3.   接收資料

read/write   send/recv   sendto/recvfrom

4. 關閉socket

///  socketa.c

#include #include #include #include #include #include main()

; addr.sun_family=af_unix;

memcpy(addr.sun_path,"my.sock",

strlen("my.sock"));

//3.把socket繫結在位址上

r=bind(fd,(struct sockaddr*)&addr,sizeof(addr));

if(r==-1) printf("bind err:%m\n"),exit(-1);

printf("位址繫結成功!\n");

//4.接收資料

bzero(buf,sizeof(buf));

r=read(fd,buf,sizeof(buf));

buf[r]=0;

printf("%s\n",buf);

//5.關閉

close(fd);

//6.刪除socket檔案

unlink("my.sock");

}

#include #include #include #include #include #include main()

; //1.建立socket

fd=socket(af_unix,sock_dgram,0);

//fd=socket(af_unix,sock_stream,0);

//2.連線到指定的位址

addr.sun_family=af_unix;

memcpy(addr.sun_path,"my.sock",

strlen("my.sock"));

r=connect(fd,(struct sockaddr*)&addr,

sizeof(addr));

//3.傳送資料

write(fd,"自強不息,知行合一!",

strlen("自強不息,知行合一!"));

//read(fd,buf,100);

// printf("%s\n",buf);

// sleep(1);

//4.關閉

close(fd);

}

基於socket的檔案傳輸協議

1 我們先搭建乙個乙個伺服器與客戶機並使他們進行通訊 2 在客戶機中對輸入的指令進行判斷,將指令轉化成對應的列舉型別傳送給服務機 3 服務機對傳送過來的ftp cmd的值進行判斷,並執行相對應的功能 4 ls功能的實現 通過popen實現,獲取內容傳送客戶機並顯示 get 對指令進行分割,讀取分割後...

基於socket實現大檔案上傳

import socket 1.客戶端 操作流程 先拿到檔案 獲取檔案大小 建立字典 1.製作表頭 header 如何得到 他是乙個二進位制字串 序列化得到 字典字串 轉成二進位制字串 header bytes 打包 header len struct.pack i len header bytes...

基於Socket的檔案傳輸(使用CSocket類)

本軟體使用 mfc採用物件導向的方法實現了基於 socket 的檔案傳輸。這是原來研究生課程的結課作業,實現了socket的傳送和接收,以及讀取ini配置檔案等操作。使用了csocket類 以下是當時結課作業 的正文 一 軟體特點如下 1.採用了多執行緒的方法,檔案傳輸時使用 afxbeginthr...