`
memorymyann
  • 浏览: 266325 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

19.unix域协议与TCP UDP不同之处

阅读更多

之前说过一些区别,但基本对我们编程来说没有太多影响,但以下几个方面是需要注意到的。

1.当调用connect时候,需要注意的是打开文件的权限。只有进程能够有足够的权限,connect才会能够返回。

2.当发现监听套接口的队列满的时候,会立刻返回一个ECONNREFUSED错误。而之前的TCP不会返回错误,TCP客户端会认为是SYN包丢失而多次向服务器发送SYN。

3.在UNIX域协议中,如果采用SOCK_DGRAM方式通信,在未绑定的套接口上不会捆绑一个路径名(UDP不同,没有执行bind的客户端,系统会自动分配一个地址和端口号),当然,如果只是发送数据,仍然可以成功,但是当想返回数据的时候,数据是无法返回,如果想得到返回数据必须为其捆绑一个路径名。如下面这端程序

 

服务器

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"
#include "sys/un.h"

int main(int argc, char ** argv) {
        int sockfd;
        socklen_t len;
        struct sockaddr_un addr, client_addr;
        char buf[101];

        sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);

        bzero(&addr, sizeof(struct sockaddr_un));
        addr.sun_family = AF_LOCAL;

        strncpy(addr.sun_path, argv[1], sizeof(addr.sun_path) - 1);
        unlink(argv[1]);
        int flag = bind(sockfd, (struct sockaddr *)&addr, SUN_LEN(&addr));
        if(flag == -1) {
                printf("bind socket error\n");
                exit(1);
        }
        len = sizeof(client_addr);
        int n = recvfrom(sockfd, buf, 100, 0, (struct sockaddr *)&client_addr, &len);
        printf("bound name = %s\n", client_addr.sun_path);
        buf[n] = '\0';
        printf("get message:%s", buf);
        n = sendto(sockfd, buf, n, 0, (struct sockaddr *)&client_addr, len);
        close(sockfd);
}

 

客户端

#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"
#include "sys/un.h"

int main(int argc, char ** argv) {
        int sockfd;
        socklen_t len;
        struct sockaddr_un addr;
        struct sockaddr_un my_addr;

        sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);
        bzero(&addr, sizeof(struct sockaddr_un));
        addr.sun_family = AF_LOCAL;
        strncpy(addr.sun_path, argv[1], sizeof(addr.sun_path) - 1);

        bzero(&my_addr, sizeof(struct sockaddr_un));
        my_addr.sun_family = AF_LOCAL;
        strncpy(my_addr.sun_path, argv[2], sizeof(my_addr.sun_path) - 1);

        unlink(argv[2]);
        bind(sockfd, (struct sockaddr *)&my_addr, SUN_LEN(&my_addr)); //这一步如果是想得到从服务器的返回数据则必须做,不然无法得到返回数据,当然如果不需要返回只是发送则无需这一步。

        char buf[101];
        char buf1[101];
        int n = read(0, buf, 100);
        len = sizeof(addr);
        int m = sendto(sockfd, buf, n, 0, (struct sockaddr *)&addr, len);
        int c = recvfrom(sockfd, buf1, 100, 0, NULL, NULL);
        buf1[c] = '\0';
        printf("get message:%s", buf1);
        close(sockfd);
        exit(0);
}

分享到:
评论

相关推荐

    TCPIP协议详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。《TCP/IP详解·卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望...

    TCP/IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议

    当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员...

    TCP-IP详解.卷三:TCP事务协议,HTTP,NNTP和UNIX域协议.rar

    卷三:TCP事务协议,HTTP,NNTP和UNIX域协议.rar是TCP-IP系列的第三卷,已全部上传完毕,超清晰 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-...

    TCP-IP详解.卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议.rar

    第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp...

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

    UNIX域协议,这是在UNIX实现中应用非常广泛的一套协议。 与前面两卷一样,本书有丰富的例子和实现的细节,他们都是4.4BSD-Lite中的网络代码。 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 ...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议——高清文字(china-pub经典系列)

    第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp...

    UNIX Network Programming Volume 1, Third Edition (Unix网络编程卷1第3版英文版)

    Unix网络编程卷1,第三版,英文版。大名顶顶的Richard Stevens所写 目录: Copyright Addison-Wesley Professional Computing Series Foreword Preface Introduction Changes from the Second Edition ...

    Linux网络编程.pdf socket tcp udp

    2.2.1 UNIX/Linux 文件系统简介 ......................................................................19 2.2.2 流和标准 I/O 库.............................................................................

    UNIX网络编程第1卷(1-19章)

    第一章 简介 第二章 传输层:TCP UDP 第三章 套接口编程简介 第四章 基本TCP套接口编程 ...第十四章 Unix域协议 第十五章 非阻塞I/O 第十六章 ioctl操作 第十七章 路由器接口 第十八章 广播 第十九章 多播

    TCP-IP详解.卷一:协议

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    RFC1180 TCP&IP; 教程 中文整理版

    与ISO OSI相比而言,TCP/IP的发展前景.本文的内容是网络专业人士从事TCP/IP方面工作所必须掌握的最基本知识.这里指的网络"专业人士",包括系统管理员,系统程序员,网络管理员.本文以UNIX环境下的TCP/IP为例进行讲述....

    TCP-IP详解卷3:TCP事务协议

    第18章 Unix域协议:I/O和描述符的传递 210 18.1 概述 210 18.2 PRU_SEND和PRU_RCVD请求 210 18.3 描述符的传递 214 18.4 unp_internalize函数 218 18.5 unp_externalize函数 220 18.6 unp_discard函数 221 18.7 unp...

    TCP-IP详解卷1:协议

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    TCP_IP协议详解卷一

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

Global site tag (gtag.js) - Google Analytics