#include <sys/un.h>
struct sockaddr_un
{
sa_family_t sun_family; /* AF_LOCAL */
char sun_path[104]; /*可能是92~108*/
};
#include <sys/socket.h>
//创建两个连接起来的Unix域套接字
int socketpair(int family/*AF_LOCAL*/, int type, int protocol/*0*/, int sockfd[2]);//SOCK_STREAM创建全双工的流管道
Unix域字节流客户端
#include "../Gnet.h"
void do_client(int connfd)
{
char buf[MAX_LINE];
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
Write(connfd, buf, strlen(buf));
memset(buf, 0, MAX_LINE);
if(Read(connfd, buf, MAX_LINE) == 0)
perr_exit("server terminated.\n");
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int connfd;
struct sockaddr_un server_addr;
connfd = Socket(AF_LOCAL, SOCK_STREAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
Connect(connfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
do_client(connfd);
return 0;
}
Unix字节流服务器
#include "../Gnet.h"
void do_server(int connfd)
{
ssize_t nread;
char buf[MAX_LINE];
while((nread = Read(connfd, buf, MAX_LINE)) > 0)
Write(connfd, buf, nread);
}
void sig_child(int signo)
{
pid_t pid;
int stat;
printf("in sig_child.\n");
while((pid = waitpid(-1,&stat, WNOHANG)) > 0)
printf("child %d terminated\n", pid);
printf("out sig_child.\n");
}
int main(int argc, const char* argv[])
{
int lfd, connfd;
struct sockaddr_un server_addr, client_addr;
socklen_t client_addr_len;
pid_t child_id;
struct sigaction sigaction_set, sigaction_get;
sigaction_set.sa_handler = sig_child;
sigemptyset(&sigaction_set.sa_mask);
sigaction_set.sa_flags = 0;
if(sigaction(SIGCHLD, &sigaction_set, &sigaction_get) <0)
printf("sigaction(SIGCHLD) error!\n");
memset(&server_addr, 0, sizeof(server_addr));
unlink(LOCAL_STRPATH);//bind之前删除路径名
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
lfd = Socket(AF_LOCAL, SOCK_STREAM, 0);
Bind(lfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
Listen(lfd, LISTENQ);
while(1)
{
client_addr_len = sizeof(client_addr_len);
connfd = Accept(lfd, (struct sockaddr*)&client_addr, &client_addr_len);
if((child_id = fork()) == 0)//子进程
{
Close(lfd);
do_server(connfd);
Close(connfd);
exit(0);
}
else//父进程
{
printf("child %d connected\n", child_id);
Close(connfd);
}
}
return 0;
}
Unix域数据报客户端
#include "../Gnet.h"
void do_client(int udpfd, struct sockaddr* pserver_addr, socklen_t server_addr_len)
{
char buf[MAX_LINE];
int nread;
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
sendto(udpfd, buf, strlen(buf), 0, pserver_addr, server_addr_len);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, NULL, NULL);
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int sockfd;
struct sockaddr_un server_addr, client_addr;
sockfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sun_family = AF_LOCAL;
strcpy(client_addr.sun_path, tmpnam(NULL));
Bind(sockfd, (struct sockaddr*)&client_addr, sizeof(client_addr));
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
do_client(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
return 0;
}
Unix域数据报服务器
#include "../Gnet.h"
void do_server(int udpfd)
{
ssize_t nread;
char buf[MAX_LINE];
struct sockaddr_un client_addr;
socklen_t client_addr_len;
while(1)
{
client_addr_len = sizeof(client_addr);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
sendto(udpfd, buf, nread, 0, (struct sockaddr*)&client_addr, client_addr_len);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_un server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_LOCAL;
strcpy(server_addr.sun_path, LOCAL_STRPATH);
udpfd = Socket(AF_LOCAL, SOCK_DGRAM, 0);
unlink(LOCAL_STRPATH);
Bind(udpfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
printf("waiting for connecting.\n");
do_server(udpfd);
return 0;
}
github:https://github.com/gongluck/unp-notes