赞
踩
- #define UNIX_PATH_MAX 108
- struct sockaddr_un
- {
- __kernel_sa_family_t sun_family; /* 通信协议 AF_UNIX / AF_LOCAL */
- char sun_path[UNIX_PATH_MAX]; /* pathname */
- //UNIX 域协议的地址,是以'\0'结束的本地文件系统中的绝对路径名
- //会自动的创建不需要提前创建
- };
- #include <sys/types.h>
- #include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
- /*socketpair1.c*/
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdlib.h>
- #include <stdio.h>
- int main ()
- {
- int sv[2];
- int result = socketpair(AF_UNIX, SOCK_STREAM, 0, sv);
- if (result < 0){
- exit(1);
- }
- printf("sv[0] is : %d \n", sv[0]); //这两个套节字句柄并不相同,但作用是一样的
- printf("sv[1] is : %d \n", sv[1]);
- if (fork())
- {
- /* 父进程 */
- int val = 0;
- pid_t pid = getpid();
- close(sv[1]); //父进程关闭 sv[1]的读写权限
- while (1)
- {
- ++val;
- printf("%d send message: %d\n", pid, val);
- write(sv[0], &val, sizeof(val)); //父进程向管道里写数据
- //也可以去读
- // read(sv[0], &val, sizeof(val)); //如果字进程不写数据,将会导致此处堵塞
- //printf("%d receive message: %d\n", pid, val);
- sleep(1);
- }
- }
- else
- {
- /*子进程*/
- int val = 0;
- close(sv[0]); //字进程关闭 sv[0]的读写权限
- pid_t pid = getpid();
- while(1)
- {
- read(sv[1], &val, sizeof(val)); //字进程从管道中取数据
- printf("%d receive message: %d\n", pid, val);
- // printf("%d receive message: %d\n", pid, val);
- //也可以写
- // write(sv[1], &val, sizeof(val));
- }
- }
- }
- #include<stdio.h>
- #include<stdlib.h>
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <arpa/inet.h>
- #include<netinet/in.h> //为了使用 IPV4 地址结构体
- #include <string.h>
- #include <arpa/inet.h>
- #include <unistd.h>
-
- #define UNIX_PATH_PS "/home/china/sockp1" //连接的套接字地址
- #define UNIX_PATH_PC "/home/china/sockp2" //绑定的套接字地址
-
- int main(int argc,char *argv[])
- {
- system("rm /home/china/sockp2"); //防止文件重名
-
- //1.创建一个套接字
- int sockfd = socket(AF_UNIX, SOCK_STREAM,0); //创建一个本地通信 UNIX 流式套接字
- if(-1 == sockfd)
- {
- perror("create socket failed");
- exit(-1);
- }
-
- //2.绑定一个通信地址(让服务器能看到我),可不绑定
- struct sockaddr_un local;
- memset(&local,0,sizeof(struct sockaddr_un)); //清空结构体
- local.sun_family = AF_UNIX;
- strcpy(local.sun_path,UNIX_PATH_PC);
- int ret = bind(sockfd,(struct sockaddr*)&local,sizeof(local));
- if(ret == -1)
- {
- perror("bind error");
- exit(-1);
- }
- printf("bind success\n");
- //连接目标服务器
- struct sockaddr_un saddr; //保存目标服务器的地址(本地的文件名)
- memset(&saddr,0,sizeof(struct sockaddr_un)); //清空结构体
- saddr.sun_family = AF_UNIX;
- strcpy(saddr.sun_path,UNIX_PATH_PS);
- ret = connect(sockfd, (struct sockaddr*)&saddr,sizeof(saddr)); //请求连接目标服务器
- if(ret == -1)
- {
- perror("connect error");
- exit(-1);
- }
- printf("connect success\n");
- char buf[1024] = {0};
- //读取信息
- ret = recv(sockfd,buf,1024, 0);
- if(ret == -1)
- {
- perror("recv error");
- }
- printf("recv size:%d,recv data:%s\n",ret,buf);
- //发送信息
- ret = sendto(sockfd,"byebye",6,0,NULL,0);
- if(ret == -1)
- {
- perror("sendto error");
- }
- printf("sendto size:%d\n",ret);
- //关闭套接字
- shutdown(sockfd,SHUT_RDWR);
- close(sockfd);
- return 0;
- }
- #include<stdio.h>
- #include<stdlib.h>
- #include <sys/types.h> /* See NOTES */
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <arpa/inet.h>
- #include<netinet/in.h> //为了使用 IPV4 地址结构体
- #include <string.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #define UNIX_PATH_PS "/home/china/sockp1"
-
- int main(int argc,char *argv[])
- {
- system("rm /home/china/sockp1"); //保证该文件没有被使用
-
- //1.创建一个套接字
- int sockfd = socket(AF_UNIX, SOCK_STREAM,0); //创建一个本地通信UNIX 流式套接字
- if(-1 == sockfd)
- {
- perror("create socket failed");
- exit(-1);
- }
-
- //2.绑定一个通信地址(作为服务器本身的地址)
- struct sockaddr_un local; //保存服务器的地址(文件名)
- memset(&local,0,sizeof(struct sockaddr_un)); //清空结构体
- local.sun_family = AF_UNIX;
- strcpy(local.sun_path,UNIX_PATH_PS);
- int ret = bind(sockfd,(struct sockaddr*)&local,sizeof(local)); //绑定服务器的地址
- if(ret == -1)
- {
- perror("bind error");
- exit(-1);
- }
- printf("bind success\n");
-
- //3.开启对一个套接字的监听
- listen(sockfd,250);
-
- //4.等待客户端的连接
- while(1)
- {
- struct sockaddr_un caddr; //保存客户端的地址(文件名)
- socklen_t len = sizeof(caddr);
- int confd = accept(sockfd,(struct sockaddr*)&caddr,&len); //阻塞等待客户端连接
- if(confd > 0) //客户端连接成功,返回一个连接套接字专门用来和客户端通信
- {
- //一个客户端连接成功.开一个进程/线程去处理这个连接
- printf("client path:%s\n",caddr.sun_path);
- ret = sendto(confd,"nishiliangzaima?",20,0,NULL,0); //发送消息
- if(ret == -1)
- {
- perror("sendto error");
- }
- char buf[1024] = {0};
- ret = read(confd,buf,1024); //接收消息
- if(ret <= 0)
- {
- perror("recv error");
- }
- printf("recv size:%d,recv data:%s\n",ret,buf);
- close(confd);//关闭连接套接字
- }
- }
- //关闭套接字
- shutdown(sockfd,SHUT_RDWR);
- close(sockfd);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。