• 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;
    }

  • 相关阅读:
    天轰穿C#教程之C#基础的学习路线
    天轰穿C#教程之大话C#
    天轰穿C#教程之#pragma介绍[原创]
    天轰穿.NET教程之第一个控制台应用程序
    .NET笔试题整理(转)
    天轰穿.NET教程之基类库
    天轰穿C#教程之C#有哪些特点?
    程序猿!?应该有哪些目标?
    浅谈编程程序员应该具备的职业素养 [转载]
    .NET访问MySQL数据库方法(转)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/3996388.html
Copyright © 2020-2023  润新知