Linux下Socket通信(IPC),附實例

1、Linux下的Socket通信是一種基於文件的IPC通信,也可以是基於其他設備的IPC通信。它可以在本機內不同進程間實現通信,也可以在實現不同主機之間的通信。

2、Socket是一種進程間通信模式:
對等模式(P2P):一對一:UDP
客戶服務器模式(C/S):一對多:TCP

3、基本創建步驟
(1)通過socket()函數創建socket
(2)通過bind函數綁定socket於設備地址
(3)進行讀寫操作read/recv/recvfrom write/send/sendto
(4)close方法關閉套接字

4、下面是其中用到的一些函數的用法及說明
(1)socket函數
int socket(int domain,int type, int protocol)
domain:地址族 IF_INET與底層內核通信(原生數據包)
type:通信的數據格式
protocol:傳遞數的含義

通信的數據類型:
SOCK_STREAM:字節流(一對多)
SOCK_DGRAM:字節包(一對一)
SOCK_RAW:硬件層的原生數據包  

通信的協議:
0:默認協議:地址族+數據格式=唯一決定協議
指定協議 IPPROTO_TCP
        IPPROTO_UDP 
        IPPROTO_IP
        IPPROTO_ICMP
        IPPROTO_IGMP

(2)bind函數
把socket綁定到一個通信地址
int bind(int sockfd,const struct sockaddr* addr,socklen_t len)
sockfd:綁定地址的socket
addr:地址
len:地址內存長度
返回:成功是0,失敗是-1

(3)recvfrom函數
如果想返回數據發送者的地址,則使用recvfrom.
int recvfrom(int fd,
 void *buf,
 size_t len,
 int flag,
 struct sockaddr*addr,//返回數據發送者的地址) ssocklen_t *l);//輸入返回地址緩衝長度,返回實際發送者的地址長度

(4)write/send/sendto函數
int sendto(int fd,//發送socket
    const void *buf,//發送的數據
    size_t len,//發送數據的長度
    int flag,//發送數據的方式,建議爲0
    const struct sockaddr *addr,//數據        發往的目的地址
    socklen_t l);//地址長度
  返回:
    -1:發送失敗
    否則就是發送的字節數。

 

代碼如下:

test1.c

C代碼  收藏代碼
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <netinet/in.h>  
  5. #include <arpa/inet.h>  
  6.   
  7. int main(void)  
  8. {  
  9.     //create socket  
  10.     int fd = socket(AF_INET, SOCK_DGRAM, 0);  
  11.     if(fd==-1)  
  12.     {  
  13.         perror("socket\n");  
  14.         exit(-1);  
  15.     }  
  16.     printf("socket fd=%d\n",fd);  
  17.   
  18.     //build connection address  
  19.     struct sockaddr_in addr;  
  20.     addr.sin_family = AF_INET;  
  21.     addr.sin_port = htons(6666);  
  22.     addr.sin_addr.s_addr = inet_addr("127.0.0.1");  
  23.   
  24.     int r;  
  25.     r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));  
  26.     if(r==-1)  
  27.     {  
  28.         perror("bind");  
  29.         close(fd);  
  30.         exit(-1);  
  31.     }  
  32.     printf("bind address successful!\n");  
  33.     //accept or send message  
  34.     char buf[255];  
  35.     struct sockaddr_in from;  
  36.     socklen_t len;  
  37.     len = sizeof(from);  
  38.     while(1)  
  39.     {  
  40.         r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);  
  41.         if(r>0)  
  42.         {  
  43.             buf[r]=0;  
  44.             printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);  
  45.         }  
  46.         else  
  47.         {  
  48.             break;  
  49.         }  
  50.     }  
  51.     //close socket  
  52.     close(fd);  
  53.     return 0;  
  54. }  

test2.c

Java代碼  收藏代碼
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <unistd.h>  
  4. #include <string.h>  
  5. #include <sys/socket.h>  
  6. #include <netinet/in.h>  
  7. #include <arpa/inet.h>  
  8.   
  9. int main(void)  
  10. {  
  11.     //create socket  
  12.     int fd = socket(AF_INET,SOCK_DGRAM,0);  
  13.     if(fd==-1)  
  14.     {  
  15.         perror("socket");  
  16.         exit(-1);  
  17.     }  
  18.     printf("create socket OK!\n");  
  19.     //create an send address  
  20.     struct sockaddr_in addr={};  
  21.     addr.sin_family = AF_INET;  
  22.     addr.sin_port = htons(6666);  
  23.     addr.sin_addr.s_addr=inet_addr("127.0.0.1");  
  24.     //send the message to the specify address  
  25.     int r;  
  26.     char buf[255];  
  27.     while(1)  
  28.     {  
  29.         r = read(0,buf,sizeof(buf)-1);  
  30.         if(r<=0)  
  31.             break;  
  32.         sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));  
  33.     }  
  34.     //close socket  
  35.     close(fd);  
  36.     return 0;  
  37. }  

 運行結果如下:(先運行test1.o,然後運行test2.o,在test2.c運行後輸入內容,在test1.c所在終端中就會顯示信息)



 

發佈了7 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章