天天看點

本地Socket通信

伺服器端需要綁定端口,用戶端也需要綁定端口。

s_sock.c

#include <stdio.h>  

#include<unistd.h>

#include <sys/types.h>  

#include <sys/socket.h>  

#include <sys/un.h>   

#include <errno.h>

#define SERVER_ADDRESS "/tmp/SERVER_ADDRESS"  

//#define CLIENT_ADDRESS "/tmp/CLIENT_ADDRESS"  

int main(void)  

{  

    int socket_fd;  

    int ret;  

    char recv_buf[1024];  

    char send_buf[1024];

    int len = sizeof(struct sockaddr_un);  

    struct sockaddr_un client_addr;  

    struct sockaddr_un server_addr; 

    //1.建立socket連接配接

    socket_fd=socket(AF_UNIX,SOCK_DGRAM,0);  

    if(socket_fd<0)  

    {  

        perror("cannot create communication socket");  

        return 1;

    }

    unlink(SERVER_ADDRESS);

    //2.設定伺服器參數

memset(&server_addr,0,sizeof(server_addr));

    server_addr.sun_family=AF_UNIX;  

    strncpy(server_addr.sun_path,SERVER_ADDRESS,sizeof(server_addr.sun_path)-1);  

    //3.綁定伺服器位址

    ret=bind(socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));  

    if(ret==-1)  

    {  

        perror("cannot bind server socket");  

        close(socket_fd);  

        unlink(SERVER_ADDRESS);  

        return 1;  

    }  

while(1)

{

//4.接受消息

int num = recvfrom(socket_fd,recv_buf,sizeof(recv_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,&len);

if(num>0)

{

printf("rcvfrom:%s\n",recv_buf);

//5。發送消息

memset(send_buf,0,sizeof(send_buf));  

strcpy(send_buf,"message from server"); 

ret = sendto(socket_fd,send_buf,sizeof(send_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,len);

if(ret < 0)

{

printf("send failed ! error message : %s\n",strerror(errno));

}

else

{

printf("sendto success\n");

}

}

else

{

printf("\n");

}

}

    close(socket_fd);  

    unlink(SERVER_ADDRESS);  

    return 0;  

}  

c_socket.c

#include <stdio.h>  

#include <unistd.h>

#include <sys/types.h>  

#include <sys/socket.h>  

#include <sys/un.h>  

#include <errno.h>

#define SERVER_ADDRESS "/tmp/SERVER_ADDRESS"  

#define CLIENT_ADDRESS "/tmp/CLIENT_ADDRESS"  

int main(void)  

{  

int ret=-1;

    int socket_fd;  

    char send_buf[1024];  

    char recv_buf[1024];

char clientSock[256];

    int len = sizeof(struct sockaddr_un);  

    struct sockaddr_un server_addr;  

struct sockaddr_un client_addr;  

    //1.建立socket連接配接  

    socket_fd=socket(AF_UNIX,SOCK_DGRAM,0);  

    if(socket_fd<0)  

    {  

        perror("cannot create communication socket");  

        return 1;  

    }    

sprintf(clientSock,"/tmp/CLIENT_ADDRESS_%d",socket_fd);

unlink(clientSock); //防止之前線程建立相同socket檔案後,退出未關閉socket。

//2.設定伺服器

    server_addr.sun_family=AF_UNIX;  

strncpy(server_addr.sun_path,clientSock,sizeof(server_addr.sun_path)-1);

//3.綁定伺服器位址

ret=bind(socket_fd,(struct sockaddr*)&server_addr,sizeof(server_addr));  //産生socket檔案

    if(ret==-1)  

    {  

        perror("cannot bind server socket");  

        unlink(clientSock); 

close(socket_fd);  

        return 1;  

    }  

//設定發送資料

    memset(send_buf,0,1024);  

    strcpy(send_buf,"message from client");   

memset(&client_addr,0,sizeof(client_addr));

client_addr.sun_family=AF_UNIX;

strncpy(client_addr.sun_path,SERVER_ADDRESS,sizeof(client_addr.sun_path)-1);

//發送資料

ret = sendto(socket_fd,send_buf,sizeof(send_buf),MSG_DONTWAIT,(struct sockaddr *)&client_addr,len);

if(ret>0)

{

printf("send success\n");

}

else

{

printf("send failed ! error message : %s\n",strerror(errno));

}

sleep(6);

//接受資料

memset(recv_buf,0,sizeof(recv_buf));

ret = recvfrom(socket_fd,recv_buf,sizeof(recv_buf),MSG_DONTWAIT,(struct sockaddr *)&server_addr,&len);

if(ret>0)

{

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

}

else

{

printf("recv err\n");

}

    //關閉socket

unlink(clientSock); 

close(socket_fd);

    return 0;  

}  

繼續閱讀