**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,主機位元組序和網路...