https://blog.csdn.net/shanzhizi/article/details/16882087
========================tcp 方式============================
服务器端:
//s_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
struct sockaddr_un clt_addr;
struct sockaddr_un srv_addr;
listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
if(listen_fd<0)
{
perror("cannot create communication socket");
return 1;
}
//set server addr_param
srv_addr.sun_family=AF_UNIX;
strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
unlink(UNIX_DOMAIN);
/*unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes
unlink() deletes a name from the filesystem. If that name was the last link to a file and no processes
have the file open the file is deleted and the space it was using is made available for reuse.
If the name was the last link to a file but any processes still have the file open the file will remain in existence
until the last file descriptor referring to it is closed. If the name referred to a symbolic link the link is removed.
If the name referred to a socket, fifo or device the name for it is removed but processes which have the object
open may continue to use it.
首先你要明确一个概念,一个文件是否存在取决于它的inode是否存在,你在目录里看到的是目录项里一条指向该inode的链接,
而不是文件的本身.当你调用unlink的时候他直接把目录项里的该条链接删除了,但是inode并没有动,该文件还是存在的,
这时候你会发现,目录里找不到该文件,但是已经打开这个文件的进程可以正常读写.只有当打开这个inode的所有文件描述符
被关闭,指向该inode的链接数为0的情况下,这个文件的inode才会被真正的删除.
从unlink的名字上就应该能判断出来,unlink含义为取消链接,remove才是删除的意思
*/
//bind sockfd & addr
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1)
{
perror("cannot bind server socket");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//listen sockfd listen函数不会阻塞,立即返回
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(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_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=====info=====/n");
for(i=0;i<4;i++)
{
memset(recv_buf,0,1024);
int num=read(com_fd,recv_buf,sizeof(recv_buf));
printf("Message from client (%d)) :%s/n",num,recv_buf);
}
close(com_fd);
close(listen_fd);
unlink(UNIX_DOMAIN);
return 0;
}
客户端:
//c_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.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 srv_addr;
//creat unix socket
connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
if(connect_fd<0)
{
perror("cannot create communication socket");
return 1;
}
srv_addr.sun_family=AF_UNIX;
strcpy(srv_addr.sun_path,UNIX_DOMAIN);
//connect server
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_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");
//send info server
for(i=0;i<4;i++)
write(connect_fd,snd_buf,sizeof(snd_buf));
close(connect_fd);
return 0;
}
=======================================================================
udp方式
server端:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#define PATH "./tt"
int main(int argc ,char *argv[])
{
int sockfd = 0;
struct sockaddr_un addr;
unlink(PATH);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path,PATH);
unsigned int len = strlen(addr.sun_path) + sizeof(addr.sun_family);
sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
if(sockfd < 0 )
{
perror("socket error");
exit(-1);
}
if(bind(sockfd,(struct sockaddr *)&addr,len) < 0)
{
perror("bind error");
close(sockfd);
exit(-1);
}
printf("Bind is ok\n");
while(1)
{
char recv_buf[20] = "";
recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&addr,&len);
printf("Recv: %s\n",recv_buf);
}
return 0;
}
client端:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#define PATH "./tt"
int main(int argc,char *argv[])
{
int sockfd = 0;
struct sockaddr_un addr;
bzero(&addr,sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path,PATH);
sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
if(sockfd < 0)
{
perror("socket error");
exit(-1);
}
while(1)
{
static int counter = 0;
char send_buf[20] = "";
counter++;
sprintf(send_buf,"Counter is %d",counter);
int len = strlen(addr.sun_path)+sizeof(addr.sun_family);
sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr*)&addr,len);
printf("Send: %s\n",send_buf);
sleep(1);
}
return 0;
}
tcp server tcp client
socket socket
unlink
bind
listen
accept connect
write read
close close
unlink
udp server udp client
socket socket
bind
recvfrom sendto
close close