进程间的通信方式有多种,今天来学一下socket实现进程间通信,听说这种通信方式现在用的最多,看代码吧。
[mapan@localhost TCP]$ ls
client.cpp makefile server.cpp
[mapan@localhost TCP]$ cat server.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/un.h>
#define MAXLINE 4096
#define UNIXSTR_PATH "/tmp/unix.str"
int main()
{
int listenfd,connfd;
socklen_t clilen;
struct sockaddr_un cliaddr,servaddr;
char recvbuf[20]={0};
listenfd=socket(AF_LOCAL,SOCK_STREAM,0);
unlink(UNIXSTR_PATH);
bzero(&servaddr,sizeof(servaddr));
servaddr.sun_family=AF_LOCAL;
strcpy(servaddr.sun_path,UNIXSTR_PATH);
bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
listen(listenfd,5);
clilen=sizeof(cliaddr);
connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);
printf("pid=%d\n",getpid());
read(connfd,recvbuf,sizeof(recvbuf));
printf("recvbuf=%s\n",recvbuf);
getchar();
close(connfd);
close(listenfd);
return 0;
}
[mapan@localhost TCP]$ cat client.cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/un.h>
#define MAXLINE 4096
#define UNIXSTR_PATH "/tmp/unix.str"
int main()
{
int sockfd;
struct sockaddr_un servaddr;
char sendbuf[20]="1111111";
sockfd=socket(AF_LOCAL,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sun_family=AF_LOCAL;
strcpy(servaddr.sun_path,UNIXSTR_PATH);
int ret=connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
write(sockfd,sendbuf,strlen(sendbuf));
getchar();
close(sockfd);
return 0;
}
[mapan@localhost TCP]$ cat makefile
all:server client
server.o:server.cpp
g++ -c server.cpp
client.o:client.cpp
g++ -c client.cpp
server:server.o
g++ -o server server.o
client:client.o
g++ -o client client.o
clean:
rm -f server client *.o
[mapan@localhost TCP]$
编译运行,运行服务端,打开另一个窗口运行客户端。
[mapan@localhost TCP]$ make
g++ -c server.cpp
g++ -o server server.o
g++ -c client.cpp
g++ -o client client.o
[mapan@localhost TCP]$ ./server
pid=22701
recvbuf=1111111
通信成功,sockaddr_un本地通讯的套接字结构,它有2个参数:sun_family,sun_path。最重要的还是实践,其他零星知识点网上很多我就不赘述了。
参考资料:unix网络编程 卷一