之前说过一些区别,但基本对我们编程来说没有太多影响,但以下几个方面是需要注意到的。
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);
}
分享到:
相关推荐
当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。《TCP/IP详解·卷3:TCP事务协议、HTTP、NNTP和UNIX域协议》同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望...
当客户与服务器进程在同一台主机上时,UNIX域协议通常要比TCP/IP快一倍。本书同样采用了大量的实例和实现细节,并参考引用了卷2中的大量源程序。适用于希望理解TCP/IP如何工作的人,包括编写网络应用程序的程序员...
卷三:TCP事务协议,HTTP,NNTP和UNIX域协议.rar是TCP-IP系列的第三卷,已全部上传完毕,超清晰 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-...
第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的成...
第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域协议,这是在UNIX实现中应用非常广泛的一套协议。 与前面两卷一样,本书有丰富的例子和实现的细节,他们都是4.4BSD-Lite中的网络代码。 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 ...
### TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议 #### 1.1 概述 本章节重点介绍了客户-服务器事务的概念,并通过对比使用UDP和TCP的不同情况,来探讨TCP事务协议(T/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...
Unix网络编程卷1,第三版,英文版。大名顶顶的Richard Stevens所写 目录: Copyright Addison-Wesley Professional Computing Series Foreword Preface Introduction Changes from the Second Edition ...
《UNIX网络编程》第一卷主要涵盖了网络编程的基本概念、传输层协议TCP和UDP的细节、套接口编程的原理与应用,以及高级网络编程技术。该书是网络编程领域的经典之作,作者是著名的网络编程专家W. Richard Stevens。...
第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的成...
**Netstat** 是一款在Linux系统中广泛使用的网络诊断工具,主要用于展示与IP、TCP、UDP和ICMP等网络协议相关的统计数据。通过Netstat,用户可以方便地监控网络连接的状态、统计网络活动、排查网络故障等问题。...
第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详解,卷1:协议》(共3卷,其他卷请到我的空间下载)是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获...