转自 http://blog.youkuaiyun.com/lanyang123456/article/details/40299623
socket在主机间和进程间使用,方法类似,主要区别是进程间通信使用的是sockaddr_un,而主机间的通信使用的是sockadd_in。
- struct sockaddr_un{
- sa_family_t sun_family;//AF_UNIX,它是一个短整型
- char sum_path[];//路径名 <pre name="code" class="cpp">};
- struct sockaddr_in{
- short int sin_family;//AF_INET
- unsigned short int sin_port;//端口号
- struct in_addr sin_addr;//IP地址
- };
而in_addr被定义为:
使用socket作为进程间通信方式,有什么注意事项?
(1) Server
(2) client
例子如下:
server
- /*
- IPC
- socket AF_UNIX
- server
- */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <errno.h>
- #define UNIX_DOMAIN "/tmp/UNIX.domain"
- #define QUEUE_LEN 5
- int main(void)
- {
- socklen_t clt_addr_len;
- int listen_fd;
- int com_fd;
- int ret;
- int i;
- char recv_buf[1024];
- int len;
- struct sockaddr_un client_addr;
- struct sockaddr_un server_addr;
- listen_fd=socket(PF_UNIX, SOCK_STREAM, 0);
- if(listen_fd < 0)
- {
- perror("cannot create communication socket");
- return -1;
- }
- //set server addr
- server_addr.sun_family = AF_UNIX;
- strncpy(server_addr.sun_path, UNIX_DOMAIN, sizeof(server_addr.sun_path) - 1);
- unlink(UNIX_DOMAIN);
- //bind sockfd & addr
- ret = bind(listen_fd, (struct sockaddr*)&server_addr,sizeof(server_addr));
- if(ret == -1)
- {
- perror("cannot bind server socket");
- close(listen_fd);
- unlink(UNIX_DOMAIN);
- return -1;
- }
- //listen sockfd
- ret = listen(listen_fd, 1);
- if(ret==-1)
- {
- perror("cannot listen the client connect request");
- close(listen_fd);
- unlink(UNIX_DOMAIN);
- return -1;
- }
- //have connect request use accept
- len = sizeof(client_addr);
- com_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len);
- if(com_fd < 0)
- {
- perror("cannot accept client connect request");
- close(listen_fd);
- unlink(UNIX_DOMAIN);
- return -1;
- }
- //read and printf sent client info
- printf("---------------\n");
- memset(recv_buf,0,1024);
- ret = read(com_fd, recv_buf, sizeof(recv_buf) - 1);
- if (ret <= 0)
- {
- printf("write error(%d) %s\n", errno, strerror(errno));
- close(com_fd);
- close(listen_fd);
- unlink(UNIX_DOMAIN);
- return -1;
- }
- printf("Message from client :%s\n", recv_buf);
- close(com_fd);
- close(listen_fd);
- unlink(UNIX_DOMAIN);
- return 0;
- }
client
- /*
- IPC
- socket AF_UNIX
- client
- */
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/un.h>
- #include <errno.h>
- #define UNIX_DOMAIN "/tmp/UNIX.domain"
- int main(void)
- {
- int connect_fd;
- int ret;
- char snd_buf[1024];
- int i;
- static struct sockaddr_un server_addr;
- //creat unix socket
- connect_fd=socket(AF_UNIX, SOCK_STREAM, 0);
- if(connect_fd<0)
- {
- perror("cannot create communication socket");
- return 1;
- }
- server_addr.sun_family = AF_UNIX;
- strcpy(server_addr.sun_path, UNIX_DOMAIN);
- //connect server
- ret=connect(connect_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
- if(ret==-1)
- {
- perror("cannot connect to the server");
- close(connect_fd);
- return 1;
- }
- memset(snd_buf, 0, 1024);
- strcpy(snd_buf, "message from client");
- ret = write(connect_fd,snd_buf,sizeof(snd_buf));
- if (ret <= 0)
- {
- printf("write error(%d) %s\n", errno, strerror(errno));
- close(connect_fd);
- return -1;
- }
- close(connect_fd);
- return 0;
- }
测试:
#./server
可通过一下命令查看结果
$ netstat -an | grep tmp/UNIX.domain
unix 2 [ ACC ] STREAM LISTENING 302051 /tmp/UNIX.domain
参考
http://blog.chinaunix.net/uid-26790551-id-3171897.html
http://blog.sina.com.cn/s/blog_9cd4235201019cy6.html