SOCK通信:AF_UNIX域 :服务器-客户端

简介:

服务器端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{int sersock,cltsock;
 int len,clen;
 int ret=0;
 struct sockaddr_un seraddr,cltaddr;
 sersock=socket(AF_UNIX,SOCK_STREAM,0);
 if(sersock<0)  {return ;}
 memset(&seraddr,0,sizeof(seraddr));
 seraddr.sun_family=AF_UNIX;
 sprintf(seraddr.sun_path,"ser");
 unlink(seraddr.sun_path);
 len = offsetof(struct sockaddr_un, sun_path) + strlen(seraddr.sun_path);
 if (0 > bind(sersock, (struct sockaddr *)&seraddr, sizeof(struct sockaddr)) ||      //
        0 > listen(sersock, 10))
        {printf("fail to bind and lisen \n");}
     printf("Start to listen connect request from unix socket name: \"%s\"\n", seraddr.sun_path);
while(1)
{ clen=sizeof(cltaddr);
  cltsock=accept(sersock,(struct sockaddr*)&cltaddr,&clen);
  if(0>cltsock)
   {printf("ACCEPT  error\n");}
  clen -= offsetof(struct sockaddr_un, sun_path);
  cltaddr.sun_path[clen] = 0;
        while(1)
        {
         ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf(buf);
         if (ret != send(cltsock, buf,ret, 0))
            {printf("AgentSrv send message fail\n");}
        } 
}
close(cltsock);
close(sersock);
}

 

 

客户端:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stddef.h>
char buf[100];
void main(void)
{
    int cltsock, len, err;
    struct sockaddr_un cltaddr;
    struct sockaddr_un seraddr;
  int ret;
    cltsock = socket(AF_UNIX, SOCK_STREAM, 0);
    if (cltsock < 0)
    {
     printf("socket creat error !!!\n");
      return;
    }
    memset(&cltaddr, 0, sizeof(cltaddr));
    cltaddr.sun_family = AF_UNIX;
    sprintf(cltaddr.sun_path, "clt");
    len = offsetof(struct sockaddr_un, sun_path) + strlen(cltaddr.sun_path);
    unlink(cltaddr.sun_path); //若已存在,先删除之
    if (bind(cltsock, (struct sockaddr *)&cltaddr, sizeof(struct sockaddr)) < 0)  //绑定之后才能建立文件路劲
    {
        printf("Bind socket to addr fail\n");
        close(cltsock);
        return;
    }
    
 /*   if(chmod(cltaddr.sun_path, S_IRWXU) < 0)     //修改文件权限:可以不需要
    {
        printf("Set %s rwx for user only fail\n", cltaddr.sun_path);
        return;
    }
*/ 
    //设置服务端地址
    memset((char*)&seraddr, 0, sizeof(seraddr));
    seraddr.sun_family = AF_UNIX;
    strcpy(seraddr.sun_path, "ser");
    len = offsetof(struct sockaddr_un, sun_path) + strlen("ser");
    //以客户端socket连接服务端地址
    if (connect(cltsock, (struct sockaddr *)&seraddr, len) < 0)
    {
        printf("Connect agent sock \"%s\" fail\n", "ser");
        return;
    }
    while(1)
    {printf("input a line:");
     gets(buf);
     len=strlen(buf);
     printf("\nsend cnt:%d\n",len);
     if (len != send(cltsock, buf, len, 0))
   {
    printf("Send msg fail\n");
    return ;
   }
   ret = recv(cltsock,buf,100, 0);
         buf[ret]=0;
         printf("\nreceived: %s\n",buf);
    }
    close(cltsock);
}



本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1662514,如需转载请自行联系原作者

相关文章
|
28天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
110 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
28天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
111 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
1月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
32 1
使用Netty实现文件传输的HTTP服务器和客户端
|
26天前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
1月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
58 2
|
1月前
|
存储 网络协议 Java
【网络】UDP回显服务器和客户端的构造,以及连接流程
【网络】UDP回显服务器和客户端的构造,以及连接流程
49 2
|
22天前
|
安全 区块链 数据库
|
1月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
18 0
|
1月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
24 0
文件上传 图片上传 客户端图片上传到服务器
文件上传 图片上传 客户端图片上传到服务器