歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux IPC udp/tcp/UNIX域 socket編程

Linux IPC udp/tcp/UNIX域 socket編程

日期:2017/3/1 9:10:13   编辑:Linux編程

UNIX域套接字本地通信即在socket第一個參數中選擇AF_LOCAL,socket是BSD提出的一種適用於所有的情況的進程間通信的方式,雖然現在多用於網絡通信,但是本機內的進程間通信也是沒有問題的,使用socket機制的UNIX域常用在前台進程和後台進程的通信。VS tcp/ip和udp/ip的socket在CS兩端使用的讀寫sockfd函數不同,在UNIX域下,CS兩端都使用read()/write()對socket進行讀寫。

模型

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
//服務器:  

socket()              //創建socket                    
struct sockaddr_in    //准備通信sock文件      
bind()                //綁定socket和addr
write()/read()         //進行通信           
close()               //關閉socket            

//客戶端:

socket()              //創建socket
//准備通信地址:服務器准備的sock文件
connect()             //鏈接socket和通信地址
write()/read()         //進行通信
close()               //關閉socket

socket()

//創建網絡端點,返回socket文件描述符,失敗返回-1設errno
int socket(int domain, int type, int protocol);

domain :協議族(protocol family)(網絡通訊(IP)還是本地通訊(xxx.socket))

  • AF_LOCAL本地通訊/AF_UNIX/

type :協議

  • SOCK_STREAM //流式套接字, 實現包括但不限於TCP協議,which is有序,可靠雙向面向連接的字節流通信方式
  • SOCK_DGRAM //數據報套接字, 實現包括但不限於UDP協議, which is不可靠,無連接的數據報通信方式

protocol: 特殊協議, 一般給0

准備通信地址:

struct sockaddr{    //主要用於函數的形參類型, 很少定義結構體變量使用, 叫做通用的通信地址類型//$man bind
    sa_family_t     sa_family;
    char            sa_data[14];
}
struct sockaddr_un{ //准備本地通信的通信地址   //$man un.h
    sa_family_t     sun_family;//協議族,就是socket()的domain的AF_LOCAL
    char            sun_path[];//文件的路徑
}

bind()

//把通信地址和socket文件描述符綁定,用在服務器端,成功返回0,失敗返回-1設errno
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())
addr: 需要強制類型轉換成socketaddr_un或soketaddr_in, 參見上
addrlen: 通信地址的大小, 使用sizeof();

connect():

//初始化一個socket的連接,用在客戶端,成功返回0,失敗返回-1設errno
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())
addr: 需要強制類型轉換成socketaddr_un或soketaddr_in, 參見上
addrlen: 通信地址的大小, 使用sizeof();

例子

//UNIX域數據報socket進程間通信
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
    //1. create socket
    int sockfd=socket(AF_LOCAL,SOCK_DGRAM,0);   
    if(-1==sockfd)
        perror("socket"),exit(-1);
    printf("create socket successfully\n");

    //2. prepare communication addr
    struct sockaddr_un addr;
    addr.sun_family=AF_LOCAL;
    strcpy(addr.sun_path,"a.sock"); //會自動創建a.sock文件
    
    //3. bind socket and addr
    int res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));      //客戶端是connect()
    if(-1==res)
        perror("bind"),exit(-1);
    printf("bind successfully\n");
    
    //4. communicate
    char buf[100]={0};
    res=read(sockfd,&buf,sizeof(buf));                          //客戶端是write()
    if(-1==res)
        perror("read"),exit(-1);
    printf("data sent by client:%s,size is %d\n",buf,sizeof(buf));

    //5. close socket
    res=close(sockfd);
    if(-1==res)
        perror("close"),exit(-1);
    printf("close successfully\n");
    return 0;
}

Copyright © Linux教程網 All Rights Reserved