/*********************程序相关信息********************* * 程序编号: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; }