socket实现进程间通信
生活随笔
收集整理的這篇文章主要介紹了
socket实现进程间通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? ? ? ?進程間的通信方式有多種,今天來學一下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 clientserver.o:server.cppg++ -c server.cpp client.o:client.cppg++ -c client.cpp server:server.og++ -o server server.o client:client.og++ -o client client.oclean: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網絡編程 卷一
?
?
?
?
總結
以上是生活随笔為你收集整理的socket实现进程间通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: getpeername()函数
- 下一篇: 抓包分析connect函数