套接字是一種通信機(jī)制,憑借這種機(jī)制,客戶/服務(wù)器系統(tǒng)的開發(fā)工作既可以在本地單機(jī)上進(jìn)行,也可以跨網(wǎng)絡(luò)進(jìn)行。
套接字的特性有三個屬性確定,它們是:域(domain),類型(type),和協(xié)議(protocol)。套接字還用地址作為它的名字。地址的格式隨域(又被稱為協(xié)議族,protocol family)的不同而不同。每個協(xié)議族又可以使用一個或多個地址族定義地址格式。
1.套接字的域
域指定套接字通信中使用的網(wǎng)絡(luò)介質(zhì)。最常見的套接字域是AF_INET,它是指Internet網(wǎng)絡(luò),許多Linux局域網(wǎng)使用的都是該網(wǎng)絡(luò),當(dāng)然,因特網(wǎng)自身用的也是它。其底層的協(xié)議——網(wǎng)際協(xié)議(IP)只有一個地址族,它使用一種特定的方式來指定網(wǎng)絡(luò)中的計算機(jī),即IP地址。
在計算機(jī)系統(tǒng)內(nèi)部,端口通過分配一個唯一的16位的整數(shù)來表示,在系統(tǒng)外部,則需要通過IP地址和端口號的組合來確定。
2.套接字類型
流套接字(在某些方面類似域標(biāo)準(zhǔn)的輸入/輸出流)提供的是一個有序,可靠,雙向字節(jié)流的連接。
流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現(xiàn)的。他們也是AF_UNIX域中常見的套接字類型。
數(shù)據(jù)包套接字
與流套接字相反,由類型SOCK_DGRAM指定的數(shù)據(jù)包套接字不建立和維持一個連接。它對可以發(fā)送的數(shù)據(jù)包的長度有限制。數(shù)據(jù)報作為一個單獨(dú)的網(wǎng)絡(luò)消息被傳輸,它可能會丟失,復(fù)制或亂序到達(dá)。
數(shù)據(jù)報套接字實在AF_INET域中通過UDP/IP連接實現(xiàn),它提供的是一種無需的不可靠服務(wù)。
3.套接字協(xié)議
只要底層的傳輸機(jī)制允許不止一個協(xié)議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協(xié)議。
先上一個代碼
服務(wù)端:
//s_unix.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void) { socklen_t clt_addr_len; int listen_fd; int com_fd; int ret; int i; static char recv_buf[1024]; int len; struct sockaddr_un clt_addr; struct sockaddr_un srv_addr; listen_fd=socket(PF_UNIX,SOCK_STREAM,0); if(listen_fd<0) { perror("cannot create communication socket"); return 1; } //set server addr_param srv_addr.sun_family=AF_UNIX; strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1); unlink(UNIX_DOMAIN); //bind sockfd & addr ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr)); if(ret==-1) { perror("cannot bind server socket"); close(listen_fd); unlink(UNIX_DOMAIN); return 1; } //listen sockfd ret=listen(listen_fd,1); if(ret==-1) { perror("cannot listen the client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return 1; } //have connect request use accept len=sizeof(clt_addr); com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len); if(com_fd<0) { perror("cannot accept client connect request"); close(listen_fd); unlink(UNIX_DOMAIN); return 1; } //read and printf sent client info printf("/n=====info=====/n"); for(i=0;i<4;i++) { memset(recv_buf,0,1024); int num=read(com_fd,recv_buf,sizeof(recv_buf)); printf("Message from client (%d)) :%s/n",num,recv_buf); } close(com_fd); close(listen_fd); unlink(UNIX_DOMAIN); return 0; }
當(dāng)前標(biāo)題:Linux進(jìn)程間通信方式之socket使用實例-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://m.rwnh.cn/article48/djepep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、營銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、虛擬主機(jī)、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)