Linux網路程式設計(7)本地套接字通訊

2021-09-25 22:15:20 字數 3204 閱讀 4011

**tcp本地套接字通訊:**為了實現沒有血緣關係的程序之間通訊,通常會採用本地套接字進行通訊,在兩個程序分別繫結好了套接字檔案(.sock),執行程式後將產生兩個套接字檔案,這兩個檔案共享同一片核心緩衝區,核心將完成兩個程序之間的資料傳輸

在不同通訊中採用不同的結構體

實現流程(tcp實現)

伺服器

1.建立套接字

int lfd = socket(af_local,sock_stream,0);

2.繫結

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,「server.socket」);

bind(lfd,(struct sockaddr*)&serv,len);

3.設定監聽

listen();

4.等待接收連線請求

struct sockaddr_un client;

int len = sizeof(client);

int cfd = accept(lfd,&client,&len);

5.通訊

傳送資料:send

接收資料:recv

6.斷開連線

close(cfd);

close(lfd);

客戶端

1.建立套接字

int fd =socket(af_local,sock_stream,0);

2.繫結套接字檔案

struct sockaddr_un client;

client.sun_family = af_local;

strcpy(client.sun_path,「client.socket」);

bind(fd,(strcut sockaddr*)&client,len);

3.建立連線

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,「server.soket」);

connetc(fd,&serv,sizeof(server));

4.通訊

傳送資料:send();

接收資料:recv();

5.關閉連線

close(fd);

完整**

伺服器

#include #include #include #include #include #include #include #include int main(int argc, const char* ar**)

// 如果套接字檔案存在, 刪除套接字檔案

unlink("server.sock");

// 繫結

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path, "server.sock");

int ret = bind(lfd, (struct sockaddr*)&serv, sizeof(serv));

if(ret == -1)

// 監聽

ret = listen(lfd, 36);

if(ret == -1)

// 等待接收連線請求

struct sockaddr_un client;

socklen_t len = sizeof(client);

int cfd = accept(lfd, (struct sockaddr*)&client, &len);

if(cfd == -1)

printf("*****=client bind file: %s\n", client.sun_path);

// 通訊

while(1)

;int recvlen = recv(cfd, buf, sizeof(buf), 0);

if(recvlen == -1)

else if(recvlen == 0)

else

}close(cfd);

close(lfd);

return 0;

}

客戶端

#include #include #include #include #include #include #include #include int main(int argc, const char* ar**)

unlink("client.sock");

// ******************************==

// 給客戶端繫結乙個套接字檔案

struct sockaddr_un client;

client.sun_family = af_local;

strcpy(client.sun_path, "client.sock");

int ret = bind(fd, (struct sockaddr*)&client, sizeof(client));

if(ret == -1)

// 初始化server資訊

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path, "server.sock");

// 連線伺服器

connect(fd, (struct sockaddr*)&serv, sizeof(serv));

// 通訊

while(1)

;fgets(buf, sizeof(buf), stdin);

send(fd, buf, strlen(buf)+1, 0);

// 接收資料

recv(fd, buf, sizeof(buf), 0);

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

}close(fd);

return 0;

}

網路程式設計5 本地套接字

本地套接字是程序間通訊的一種方式,除了本地套接字外還有管道 訊息佇列等 lib common.h ifndef common h define common h include include include include include include include include inclu...

《網路程式設計》 第7章 優雅地斷開套接字連線

思想 只關閉一部分資料交換中使用的流 half close 斷開一部分連線是指,可以傳輸資料但無法接收,或可以接收資料但無法傳輸。顧名思義就是只關閉流的一半。include int shutdown int sock,int howto 功能 關閉一部分資料交換中使用的流。引數 sock 需要斷開的...

Linux網路程式設計 套接字結構

1,結構體 struct sockaddr,struct sockaddr in,struct in addr 通用套接字資料結構 struct sockaddr實際使用的套接字資料結構,二者可以進行型別轉換 struct sockaddr in struct in addr 2,主機位元組序和網路...