本地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;  
}  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值