socket实现进程间通信

来源:互联网 发布:淘宝销售冠军 编辑:程序博客网 时间:2024/05/21 12:47

             进程间的通信方式有多种,今天来学一下socket实现进程间通信,听说这种通信方式现在用的最多,看代码吧。

[mapan@localhost TCP]$ lsclient.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#defineUNIXSTR_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 clientserver.o:server.cppg++ -c server.cppclient.o:client.cppg++ -c client.cppserver:server.og++ -o server server.oclient:client.og++ -o client client.oclean:rm -f server client *.o[mapan@localhost TCP]$ 

编译运行,运行服务端,打开另一个窗口运行客户端。

[mapan@localhost TCP]$ makeg++ -c server.cppg++ -o server server.og++ -c client.cppg++ -o client client.o[mapan@localhost TCP]$ ./server pid=22701recvbuf=1111111

通信成功,sockaddr_un本地通讯的套接字结构,它有2个参数:sun_family,sun_path。最重要的还是实践,其他零星知识点网上很多我就不赘述了。



参考资料:unix网络编程 卷一




原创粉丝点击