/*********************程序相关信息*********************
* 程序编号:015
* 程序编写起始日期:2013.11.30
* 程序编写完成日期:2013.11.30
* 程序修改日期: 修改备注:
* 程序目的:学习UNIX域套接字
* 所用主要函数:socket() bind() accept() listen()
* 程序说明: 同一台机器不同进程间通信。
* 程序完成地点:
* *********************程序相关信息*********************/
#define UNIX_PATH_MAX 108
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define BUFSIZE 32
int main(void)
{
int sd, newsd;
char buf[BUFSIZE];
struct sockaddr_un myend,*p;
int ret;
sd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sd == -1) {
perror("socket()");
goto socket_err;
}
// #define UNIX_PATH_MAX 108
//
// struct sockaddr_un {
// sa_family_t sun_family; /* AF_UNIX */
// char sun_path[UNIX_PATH_MAX]; /* pathname*/
// };
//
myend.sun_family = AF_UNIX;
//int snprintf(char *str, size_t size, const char *format);
snprintf(myend.sun_path, UNIX_PATH_MAX, "rcv_sock");
// fprintf("rcv_sock","%s",myend.sun_path); //wrong
unlink(myend.sun_path);
// Call the unlink function to remove the specified FILE
ret = bind(sd, (struct sockaddr *)&myend, sizeof(myend));
if (ret == -1) {
perror("bind()");
goto bind_err;
}
//调用 listen 使其能够自动接收到来的连接并且为连接队列指定一个长度限制
listen(sd, 20);
newsd = accept(sd, NULL, 0);
if (newsd == -1) {
perror("accept()");
goto accept_err;
}
while (1) {
ret = read(newsd, buf, BUFSIZE);
/* if error */
if (ret == 0) {
break;
}
write(1, buf, ret);
write(newsd, "xxxxx\n", 6);
}
close(newsd);
close(sd);
return 0;
close(newsd);
accept_err:
bind_err:
close(sd);
socket_err:
return 1;
}
/*********************程序相关信息*********************
* 程序编号:015
* 程序编写起始日期:2013.11.30
* 程序编写完成日期:2013.11.30
* 程序修改日期: 修改备注:
* 程序目的:学习unix
* 所用主要函数:pipe(),read(),fork()
* 程序说明:在本机上运行时,可以把程序中的“./test.c”修改成自己机器上的某个文件(要带路径)
* 程序完成地点:
* *********************程序相关信息*********************/
#define UNIX_PATH_MAX 108
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#define BUFSIZE 32
int main(void)
{
int sd;
char buf[BUFSIZE];
struct sockaddr_un hisend;
int ret;
sd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sd == -1) {
perror("socket()");
goto socket_err;
}
hisend.sun_family = AF_UNIX;
snprintf(hisend.sun_path, UNIX_PATH_MAX, "rcv_sock");
ret = connect(sd, (struct sockaddr *)&hisend, sizeof(hisend));
if (ret == -1) {
perror("connect()");
goto connect_err;
}
while (1) {
ret = read(0, buf, BUFSIZE);
/* if error */
if (ret == 0) {
break;
}
write(sd, buf, ret);
ret = read(sd, buf, BUFSIZE);
write(1, buf, ret);
}
close(sd);
return 0;
accept_err:
connect_err:
close(sd);
socket_err:
return 1;
}