当前位置: 首页 > news >正文

socketpair的使用


socketpair函数概要例如以下:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
sys/types.h文件须要用来定义一些C宏常量。sys/socket.h文件必须包括进来定义socketpair函数原型。
socketpair函数须要四个參数。他们是:
套接口的域
套接口类型
使用的协议
指向存储文件描写叙述符的指针

类型參数声明了我们希望创建哪种类型的套接口。socketpair函数的选择例如以下:
SOCK_STREAM
SOCK_DGRAM
对于socketpair函数,protocol參数必须提供为0。
參数sv[2]是接收代表两个套接口的整数数组。每个文件描写叙述符代表一个套接口,而且与还有一个并没有差别。
假设函数成功,将会返回0值。否则将会返回-1表明创建失败,而且errno来表明特定的错误号。

关于流程。socketpair()函数创建出两个进程,fork()之后这两个进程都会运行主程序中的代码,这个一定要注意!尤其是bind的时候,假设bind两次的话,那就会出错了。通常会在子进程里调用一个带死循环的函数,这样就好了。(这个情况的样例会在综合运用中解说)

一下给出个简单的样例。

// 建立socket对
       #include <sys/types.h>
       #include <sys/socket.h>
    
       #include <stdlib.h>
       #include <stdio.h>
    
       int main ()
       {
         int fd[2];
   
        int r = socketpair( AF_UNIX, SOCK_STREAM, 0, fd );
        if ( r < 0 ) {
          perror( "socketpair()" );
          exit( 1 );
        }
   
        if ( fork() ) {
          /* Parent process: echo client */
          int val = 0;
          close( fd[1] );
          while ( 1 ) {
            sleep( 1 );
            ++val;
            printf( "Sending data: %d/n", val );
            write( fd[0], &val, sizeof(val) );
            read( fd[0], &val, sizeof(val) );
            printf( "Data received: %d/n", val );
          }
        }
        else {
          /* Child process: echo server */
          int val;
          close( fd[0] );
          while ( 1 ) {
            read( fd[1], &val, sizeof(val) );
            ++val;
            write( fd[1], &val, sizeof(val) );
          }
        }
      }

在给出一个用sendmsg来传递数据的样例

/*****************************************
 *
 * Listing 1.2
 *
 * Example performing I/O on s socket pair:
 *
 * ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc,char **argv)
{
    int z;        /* Status return code */
    int s[2];    /* Pair of sockets */
 struct msghdr msg;
    struct iovec iov[1];
 char send_buf[100] = "TEST";
 struct msghdr msgr;
    struct iovec iovr[1];
    char recv_buf[100];


    /*
     * Create a pair of local sockets:
     */
    z = socketpair(AF_LOCAL,SOCK_STREAM,0,s);

    if(z == -1)
    {
        fprintf(stderr,
                "%s:socketpair(AF_LOCAL,SOCK_STREAM,""0)/n",strerror(errno));
        return 1;    /* Failed */
    }

    /*
     * Sendmsg s[1]:
     */

         bzero(&msg, sizeof(msg));
         msg.msg_name = NULL;        /* attention this is a pointer to void* type */
         msg.msg_namelen = 0;
         iov[0].iov_base = send_buf;
         iov[0].iov_len = sizeof(send_buf);
         msg.msg_iov = iov;
         msg.msg_iovlen = 1;

    printf("sendmsg begin./n");
   z = sendmsg( s[1], &msg, 0 );
   if(z == -1 )
   {
    fprintf(stderr,"Sendmsg failed.  errno : %s/n",strerror(errno));
    return -1;
   }
    printf("Sendmsg Success!/n");

    /*
     * Read from socket s[0]:
     */

         bzero(&msg, sizeof(msg));
         msgr.msg_name = NULL;        /* attention this is a pointer to void* type */
         msgr.msg_namelen = 0;
         iovr[0].iov_base = &recv_buf;
         iovr[0].iov_len = sizeof(recv_buf);
         msgr.msg_iov = iovr;
         msgr.msg_iovlen = 1;

         z = recvmsg(  s[0], &msgr, 0);
   if(z == -1 )
   {
    fprintf(stderr,"Recvmsg failed.  errno : %s/n",strerror(errno));
    return -1;
   }
    printf("Recvmsg Success!/n");
 printf("recvmsg : %s/n", recv_buf);

    /*
     * Close the sockets:
     */
    close(s[0]);
    close(s[1]);

    puts("Done");
    return 0;
}

相关文章:

  • awk手册
  • 四六不分
  • Java 反射机制及Annotation
  • JavaScript超大整数加法
  • 多重和嵌套if
  • 曾国藩《挺经》卷七英才
  • OC关于NSDate类的方法和应用的总结!(全)
  • LIS问题---HDU1025 Constructing Roads In JGShining's Kingdom
  • xcode的ios工程目录结构复习
  • 基于运动特征的视频质量评价方法(基于H.264)
  • lvm的使用总结
  • C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别
  • 中国电信如何转型? ——论政企客户的需求转变
  • Oracle11g RAC常用操作 (维护及管理)
  • 【声明】请原谅我文章过短
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Git的一些常用操作
  • Javascript Math对象和Date对象常用方法详解
  • Nodejs和JavaWeb协助开发
  • React的组件模式
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 解决iview多表头动态更改列元素发生的错误
  • 力扣(LeetCode)357
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ssh免密码登录设置及问题总结
  • #pragma multi_compile #pragma shader_feature
  • #stm32驱动外设模块总结w5500模块
  • $.each()与$(selector).each()
  • $GOPATH/go.mod exists but should not goland
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (c语言)strcpy函数用法
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)shell调试方法
  • (转载)hibernate缓存
  • ***原理与防范
  • .NET CLR Hosting 简介
  • .net 设置默认首页
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET运行机制
  • .sh 的运行
  • @Pointcut 使用
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [AIGC 大数据基础]hive浅谈
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#]扩展方法
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大