UNIX域协议

echocli.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

void echo_cli(int sock)

{

char sendbuf[1024] = {0};

char recvbuf[1024] = {0};

while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)

{

write(sock, sendbuf, strlen(sendbuf));

read(sock, recvbuf, sizeof(recvbuf));

fputs(recvbuf, stdout);

memset(sendbuf, 0, sizeof(sendbuf));

memset(recvbuf, 0, sizeof(recvbuf));

}

close(sock);

}

int main(void)

{

int sock;

if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)

ERR_EXIT("socket");

struct sockaddr_un servaddr;

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sun_family = AF_UNIX;

strcpy(servaddr.sun_path, "/tmp/test_socket");

if (connect(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)

ERR_EXIT("connect");

echo_cli(sock);

return 0;

}

echosrv.c

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#define ERR_EXIT(m) \

do \

{ \

perror(m); \

exit(EXIT_FAILURE); \

} while(0)

void echo_srv(int conn)

{

char recvbuf[1024];

int n;

while (1)

{

memset(recvbuf, 0, sizeof(recvbuf));

n = read(conn, recvbuf, sizeof(recvbuf));

if (n == -1)

{

if (n == EINTR)

continue;

ERR_EXIT("read");

}

else if (n == 0)

{

printf("client close\n");

break;

}

fputs(recvbuf, stdout);

write(conn, recvbuf, strlen(recvbuf));

}

close(conn);

}

int main(void)

{

int listenfd;

if ((listenfd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)

ERR_EXIT("socket");

unlink("/tmp/test_socket");

struct sockaddr_un servaddr;

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sun_family = AF_UNIX;

strcpy(servaddr.sun_path, "/tmp/test_socket");

if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)

ERR_EXIT("bind");

if (listen(listenfd, SOMAXCONN) < 0)

ERR_EXIT("listen");

int conn;

pid_t pid;

while (1)

{

conn = accept(listenfd, NULL, NULL);

if (conn == -1)

{

if (conn == EINTR)

continue;

ERR_EXIT("accept");

}

pid = fork();

if (pid == -1)

ERR_EXIT("fork");

if (pid == 0)

{

close(listenfd);

echo_srv(conn);

exit(EXIT_SUCCESS);

}

close(conn);

}

return 0;

}

makefile:

.PHONY:clean all

CC=gcc

CFLAGS=-Wall -g

BIN=echosrv echocli

all:$(BIN)

%.o:%.c

$(CC) $(CFLAGS) -c $< -o [email protected]

clean:

rm -f *.o $(BIN)

UNIX域协议

时间: 2024-10-10 02:27:20

UNIX域协议的相关文章

Socket编程实践(14) --UNIX域协议

UNIX域协议 UNIX域套接字与TCP相比, 在同一台主机上, UNIX域套接字更有效率, 几乎是TCP的两倍(由于UNIX域套接字不需要经过网络协议栈,不需要打包/拆包,计算校验和,维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程, 而且UNIX域协议机制本质上就是可靠的通讯, 而网络协议是为不可靠的通讯设计的). UNIX域套接字可以在同一台主机上各进程之间传递文件描述符; UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述; UNIX域套接字也提供面向流和面向数据

UNP学习笔记(第十五章 UNIX域协议)

UNIX域协议是在单个主机上执行客户/服务器通信的一种方法 使用UNIX域套接字有以下3个理由: 1.UNIX域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍 2.UNIX域套接字可用于在同一个主机上的不同进程之间传递描述符 3.UNIX域套接字较新的实现把客户的凭证提供给服务器,从而能够提供额外的安全检查措施 UNIX域中用于标识客户和服务器的协议地址是普通文件系统的路径名.这些路径名不是普通的UNIX文件: 除非他们和UNIX域套接字关联起来,否则无法读写这些文件. 可以查看之前a

LINUX学习:UNIX域协议

前言介绍: 1.UNIX域套接字与TCP套接字相比较,在同一台主机的传输四度前者是后者的两倍 2.UNIX域套接字可以在同一台主机上各进程间传递描述符 3.UNIX域套接字与传统套接字的区别是用路径名来表示协议族的描述.   UNIX域地址结构 #define UNIX_PATH_MAX 108 struct sockaddr_un{ sa_family_t sun_family; /* AF_UNIX*/ char sun_path[UNIX_PATH_MAX]; /*pathname*/ }

《TCP-IP详解卷3:TCP 事务协议、HTTP、NNTP和UNIX域协议》【PDF】下载

TCP-IP详解卷3:TCP 事务协议.HTTP.NNTP和UNIX域协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP.IP详解(卷3):CP事务协议.HP.P和UIX域协议>是“TCP/IP详解系列”的延续.主要内容包括:TCP事务协议,即T/TCP,这是对TCP的扩展,使客户-服务器事务更快.更高效和更可靠:TCP/IP应用,主要是HTTP和NNTP:UNIX域协议,这些协议提供了进程之间通

UNIX域协议(命名套接字)

这里主要介绍命名UNIX域套接字 1.什么是UNIX域套接字Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务通信的一种方式.是进程间通信(IPC)的一种方式.它提供了两类套接字:字节流套接字(有点像TCP)和数据报套接字(有点像UDP)UNIX域数据报服务是可靠的,不会丢失消息,也不会传递出错. IP协议标识客户服务器是通过IP地址和端口号实现的,UNIX域协议中用于标识客户机和服务器的协议地址的是普通文件系统中的路径名. 2.UNIX域协议特点1)UNIX域套接字域TCP套

Unix网络编程之基本TCP套接字编程(上)

TCP客户/服务器实例 服务器程序 #include "unp.h" int main(int argc, char **argv) { int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket(AF_INET, SOCK_STREAM, 0); //1 bzero(&servaddr, sizeof(servad

Unix网络编程--卷一:套接字联网API 读书笔记

UNIX网络编程--卷一:套接字联网API 本书面对的读者是那些希望自己编写的程序能够使用成为套接字(socket)的API进行彼此通信的人. 目录: 1.简介 2.传输层:TCP.UDP和SCTP 3.套接字编程简介 4.基本TCP套接字编程 5.TCP客户/服务器程序例子 6.I/O复用:select和poll函数 7.套接字选项 8.基本UDP套接字编程 9.基本SCTP套接字编程 10.SCTP客户/服务器程序例子 11.名字与地址转换 12.IPV4与IPV6互操作性 13.守护进程和

Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API,包括"套接字的地址结构"."字节排序函数"等.这些API几乎是所有的网络编程中都会使用的一些,对于我们正确的编写网络程序有很大的作用.在本节中我们会介绍编写一个基于TCP的套接字程序需要的一些API,同时会介绍一个完整的TCP客户服务器程序,虽然这个程序功能相对简单,但确包含了一个客户服务器程序所有的步骤,一些复杂的程序也都是在此基础上进行扩充.在后面随着学习的深入,我们会给这个程序添加功能. 下面

【UNIX网络编程(二)】基本TCP套接字编程函数

基于TCP客户/服务器程序的套接字函数图如下: 执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型. #include <sys/socket.h> int socket(int family, int type, int protocol);/*返回值:若成功则为非负描述符,若出错则为-1*/ socket函数成功时返回一个小的非负整数值,它与文件描述符类似,把它称为套接字描述符,简称sockfd.family参数指明协议族,被称为协议域.type参数指