套接字:
原型 int socketpair(int domain, int type, int protocol, int sv[2]);
参数 domain: 协议家族, type: 套接字类型, protocol: 协议类型 ,sv: 返回套接字对
返回值:成功返回0;失败返回-1
创建套接字例子:
socketpair(AF_LOCAL,SOCK_STREAM,0,sv)
AF_LOCAL代表协议家族为unix。
SOCK_STREAM:提供面向连接的稳定数据传输,即TCP协议。
SOCK_DGRAM:分是数据包,是UDP协议网络编程是基于UDP的,专门用于局域网,基于广播
参数protocol用来指定socket所使用的传输协议编号。这一参数通常不具体设置,一般设置为0即可。
sv[0]和sv[1]都可以读写
例子:
使用套接字实现客户服务器模型(c/s)
int main(int argc,char* argv[]){
int sv[2];
char buf[BUFSIZ];
socketpair(AF_LOCAL,SOCK_STREAM,0,sv);
if(fork()){// parent
close(sv[0]);
write(sv[1],argv[1],strlen(argv[1])+1);
read(sv[1],buf,BUFSIZ);
printf("client read:\n%s",buf);
}else{// child
close(sv[1]);
read(sv[0],buf,BUFSIZ);
printf("file path:%s\n",buf);
int fd = open(buf,O_RDONLY);
bzero(buf,BUFSIZ);
read(fd,buf,BUFSIZ);
write(sv[0],buf,BUFSIZ);
// read(sv[1],buf,BUFSIZ);
}
}
使用两个FIFO实现客户服务器模型:
服务器端:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>
int main(int argc,char* argv[]){
mkfifo("/tmp/cs",0644);
int fifofd = open("/tmp/cs",O_RDONLY);
char buf[BUFSIZ];
read(fifofd,buf,BUFSIZ);
printf("%d file path:%s\n",getpid(),buf);
int fd = open(buf,O_RDONLY);
bzero(buf,BUFSIZ);
read(fd,buf,BUFSIZ);
mkfifo("/tmp/cs1",0644);
int fifofd1= open("/tmp/cs1",O_WRONLY);
write(fifofd1,buf,BUFSIZ);
close(fifofd);
close(fifofd1);
}
客户端:
int main(int argc,char* argv[]){
mkfifo("/tmp/cs",0644);
mkfifo("/tmp/cs1",0644);
int fifofd = open("/tmp/cs",O_WRONLY);
char buf[BUFSIZ];
write(fifofd,argv[1],strlen(argv[1])+1);
printf("%d write file:%s",getpid(),argv[1]);
//sleep(1);
int fifofd1 = open("/tmp/cs1",O_RDONLY);
read(fifofd1,buf,BUFSIZ);
printf("%d client read:\n%s",getpid(),buf);
}