linux网络编程--UNIX域套接字

摘要:
UNIX域套接字也可以用于本地通信。在创建套接字时,使用本地协议PF_UNIXPF_local分为流式套接字和用户数据报套接字,与其他进程间通信方法相比,它们使用方便。

UNIX域套接字

  socket同样可以用于本地通信

  创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)PF_LOCAL

  分为流式套接字和用户数据报套接字

  和其他进程间通信方式相比使用方便。效率更高

  用于前后台进程通信

本地地址结构:

 struct sockaddr_un

{

  sa_family_t sun_family;

  char sun_path[108];

};

填充地址结构

   struct sockaddr_un myaddr;

  bzero(&myaddr,sizeof(myaddr));

  myaddr.sun_family=PF_UNIX;

  strcpy(myaddr.sun_path,"mysocket");

UNIX域流式套接字

服务器端:

  socket(PF_UNIX,SOCK_STREAM,0);

  bind(本地地址);

  listen()

  aceept()

  recv/send

客户端

  socket(PF_UNIX,SOCK_STREAM,0);

  bind(本地地址);

  connect();

  recv/send();

server.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>

#define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
#define  N  128

int main(int argc, const char *argv[])
{
    int sockfd;
    int confd;
    struct sockaddr_un  serveraddr, clientaddr;
    char buf[N] = {};


    if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
    {
        err_log("fail to socket");
    }

    printf("sockfd = %d
", sockfd);

    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, "mysocket");

    if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
    {
        err_log("fail to bind");
    }

    if(listen(sockfd, 10) < 0)
    {
        err_log("fail to listen");
    }

    socklen_t addrlen = sizeof(struct sockaddr);
    if((confd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
    {
        err_log("fail to accept");
    }
    
    while(1)
    {

        if(recv(confd, buf, N, 0) < 0)
        {
            err_log("fail to recv");
        }
        printf("From client:%s
", buf);

        strcpy(buf, " Message from server");

        if(send(confd, buf, N, 0) < 0)
        {
            err_log("fail to send");
        }
    }

    close(sockfd);

    return 0;
}

client.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>

#define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
#define  N  128

// ./client  192.168.0.196  10000

int main(int argc, const char *argv[])
{
    int sockfd;
    int confd;
    struct sockaddr_un  serveraddr, clientaddr;
    char buf[N] = {0};

    if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
    {
        err_log("fail to socket");
    }

    printf("sockfd = %d
", sockfd);

    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, "mysocket");

    if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
    {
        err_log("fail to connect");
    }

    while(1)
    {
        printf("Input >");
        fgets(buf, N, stdin);
        buf[strlen(buf)-1] = '

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇XNA框架基础——XNA介绍arp报文格式解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一、前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的。而tcp通讯是项...

python2.7实现websocket服务器,可以在web实时显示远程服务器日志

一、开始的话   使用python实现websocket服务器,可以在浏览器上实时显示远程服务器的日志。   之前写了一个发布系统,每次发布版本后,为了了解发布情况(进度、是否有错误)都会登录到服务器上查看日志,有点麻烦,如果发布的服务器比较多,难道要登录到每台服务器去看日志吗?作为新时代的运维,太不能接收这种重复操作的体力劳动了,于是一个看日志的功能就这...

HTTP协议--MyWebServer

HTTP协议 HTTP协议是一种Web通信协议,通过特定的规则来实现服务器跟客户端的通信。HTTP协议有这样几个特点: (1)面向无连接的,一次只能处理一个请求,HTTP1.0服务器解析完客户端请求并作出应答后,会关闭连接;对于HTTP1.1应答后会等待一个非常短的时间,如果这段时间没有新请求,就会关闭连接。 (2)HTTP协议是无状态的,即对处理过的事务...

【Unix环境高级编程】条件变量

pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 分析:  函数作用:阻塞等待一个条件变量 阻塞等待条件变量cond(参数1)满足 释放已掌握的互斥锁(解锁互斥量),相当于pthread_mutex_unlock(&mutex); {1、2两步为一个原子操作} 当被唤...

Centos7 安装 MySQL5.7

Centos7 安装 MySQL5.7 一、环境介绍 1.安装包版本介绍 MySQL 有三种安装方式:RPM安装、二进制包安装、源码包安装。我们这篇文章以二进制方式安装MySQL 软件名称 版本 系统版本 CentOS Linux release 7.2.1511 (Core) MySQL mysql-5.7.18-linux-glibc2....

《是时候淘汰对操作系统的 fork() 调用了

是时候淘汰对操作系统的 fork() 调用了 - InfoQ 概述 一般观点认为针对线程创建 Unix 的 fork() 与 exec() 的组合堪称绝配,但微软研究院与波士顿大学联合发表的一篇论文则提出了相反的观点。他们认为 fork 在当下早已过时,对操作系统和应用程序的设计弊大于利,并给出了一些替代 fork 的方案和未来的发展路线建议。 1 引言...