网络编程练习-unix域套接字
2015-03-27 15:23
866 查看
unix域协议并不是一个实际的协议族,而是一种用在单个主机中进程间通信的方式。
unix域提供两类套接字:字节流套接字(类似TCP)和数据报套接字(类似UDP)。
除了用于常用的进程间通信,还可用于在在不同进程中间传递描述符。
unix域套接字也可以将客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。
client端:
unix域提供两类套接字:字节流套接字(类似TCP)和数据报套接字(类似UDP)。
除了用于常用的进程间通信,还可用于在在不同进程中间传递描述符。
unix域套接字也可以将客户的凭证(用户ID和组ID)提供给服务器,从而能够提供额外的安全检查措施。
<span style="font-size:14px;">/************************************************************* * file: unix_sock_cs.c * brief:文件描述符传送发送端 * yejing@2015.3.27 1.0 creat *************************************************************/ #include <stdio.h> #include <fcntl.h> #include <stdlib.h> #include <sys/un.h> #include <stddef.h> #include <sys/socket.h> #include <sys/types.h> #include <pthread.h> #define TMP_PATH "/ipcteam/yejingyf2/data/sth/yejing" #if defined(SERVER) void* send_data_task(void* param_buf){ if(!param_buf){ fprintf(stderr, "%s param error, NULL pointer. \n", __func__); return NULL; } int sockfd = *(int *)param_buf; while(1){ printf("sending data... \n"); char buf[10] = "asdfghjkl"; send(sockfd, buf, 10, 0); sleep(1); } return NULL; } int main(int argc, char* argv[]){ socklen_t clnt_len; int sockfd, ret, size, connfd; struct sockaddr_un sock_un, sock_clnt; sock_un.sun_family = AF_UNIX; strcpy(sock_un.sun_path, TMP_PATH); sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(!sockfd){ fprintf(stderr, "socket creat error. \n"); return -1; } unlink(TMP_PATH); size = offsetof(struct sockaddr_un, sun_path) + strlen(sock_un.sun_path); ret = bind(sockfd, (const struct sockaddr*)&sock_un, size); if(ret < 0){ fprintf(stderr, "socket bind error. \n"); return -1; } listen(sockfd, 13); while(1){ connfd = accept(sockfd, (struct sockaddr*)&sock_clnt, &clnt_len); if(connfd){ pthread_t tmp_task_id; pthread_create(&tmp_task_id, NULL, send_data_task, &connfd); } } } #else int main(int argc, char* argv[]){ int sockfd, ret; char buf[1024]; struct sockaddr_un sock_un; sock_un.sun_family = AF_UNIX; strcpy(sock_un.sun_path, TMP_PATH); sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(!sockfd){ fprintf(stderr, "socket create error. \n"); return -1; } ret = connect(sockfd, (struct sockaddr*)&sock_un, sizeof(sock_un)); if(ret < 0){ fprintf(stderr, "socket connect error. \n"); return -1; } while(1){ memset(buf, 0, sizeof(buf)); ret = recv(sockfd, buf, 10, 0); if(ret){ int i = 0; for(i = 0; i < ret; ++i) printf("%c", buf[i]); printf("\n"); } } } #endif</span>server端:
client端:
相关文章推荐
- 网络编程练习-UDP套接字
- unix域套接字的UDP网络编程
- unix域套接字UDP网络编程
- Linux 树莓派 网络编程中服务端通过套接字获取客户端ip地址
- 网络 套接字编程 TCP、UDP
- Linux网络编程:原始套接字的魔力【下】
- 黑马程序员---.NET高级之网络套接字(Socket)编程
- 网络编程--套接字选项
- 网络编程与并发-TCP/UDP套接字、粘包问题、Socket编程、并发编程、FTP作业
- 六、Linux网络编程-socket、套接字地址结构、地址转换、字节序、套接字类型
- java例程练习(网络编程[简单UDP通信试验])
- socket网络编程复习笔记(二):套接字基本原理(下)
- Lesson_for_java_day23--java的网络编程练习(登入界面、上传文档、上传图片、通过网络文本转换)
- 26-网络编程-16-网络编程(TCP协议-练习-上传文本文件)
- <网络编程培训之六> 使用原始套接字实现Ping
- Windows Socket 网络编程(二) —— 套接字编程原理
- Java网络编程(16):客户端套接字(Socket)的超时
- 【网络编程5】Java与Python套接字Socket通信的例子
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- Linux网络编程之套接字选项设置 .