进程笔记2:进程之间的通信(UNIX域套接字socket)
来源:互联网 发布:心神战机 知乎 编辑:程序博客网 时间:2024/05/20 02:26
socket的地址数据结构根据不同的系统以及网络环境有不同形式。为了使不同格式地址能够被传入套接字函数,必须强制将地址结构转换为:
struct sockaddr{ sa_family_t sa_family; /* address family*/ char sa_data[]; /* variable-length address*/ ...};
套接字实现可以自由地添加额外的成员并且定义sa_data成员的大小。例如在linux中,该结构定义如下
struct sockaddr{ sa_family_t sa_family; /* address family*/ char sa_data[14]; /* variable-length address*/};
其中sa_family_t表示套接字的通信域。主要有以下四个值
创建套接字的函数如下
#include <sys/socket.h>int socket(int domain, int type, int protocol);/*成功返回文件(套接字)描述符,出错返回-1
其中domain指代通信域,type指代套接字类型,主要有以下四种类型描述SOCK_DGRAM长度固定的、无连接的不可靠报文传递SOCK_RAMIP协议的数据报接口SOCK_SEQPACKET长度固定、有序、可靠的面向连接报文传递SOCK_STREAM有序、可靠、双向的面向连接字节流
参数protocol通常是零,表示按给定的域和套接字类型选择默认协议。当对同一域和套接字类型支持多个协议时,可以使用protocol参数选择一个特定协议。
一个多进程间利用UNIX域套接字(只用在本地)进行通信的例子(代码分两部分不方便观察,后面socket_unix.c将其合为了一部分)
/*domain_socket.h@Author: duanjigang @2006-4-11@Desp: declaratin of methods used for unix-domain-socket communication */#ifndef _H_#define _H_#include <stdio.h>#include <unistd.h>#include <sys/un.h>#include <sys/socket.h>#define MSG_SIZE 1024int init_send_socket(struct sockaddr_un * addr,char * path){ int sockfd,len; sockfd=socket(AF_UNIX,SOCK_DGRAM,0); if(sockfd<0) { exit(1); } bzero(addr,sizeof(struct sockaddr_un)); addr->sun_family=AF_UNIX; strcpy(addr->sun_path,path); return sockfd;}int init_recv_socket(char * path){ int sockfd,len; struct sockaddr_un addr; sockfd=socket(AF_UNIX,SOCK_DGRAM,0); if(sockfd<0) { return -1; } bzero(&addr,sizeof(struct sockaddr_un)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, path); unlink(path); len = strlen(addr.sun_path) + sizeof(addr.sun_family); if(bind(sockfd,(struct sockaddr *)&addr,len)<0) { return -1; } return sockfd;}int receive_from_socket(int sockfd, char msg[]){ int n; memset(msg, 0, MSG_SIZE); n=recvfrom(sockfd, msg, MSG_SIZE, 0, NULL, NULL); if(n<=0) { return -1; } msg[n]=0; return n;}int send_to_socket(int sockfd, char msg[], const struct sockaddr_un * addr){ int len; len = strlen(addr->sun_path)+sizeof(addr->sun_family); sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)addr,len); return 1;}#endif
运行结果示例:
Sender: message for 1 timesSender: message for 2 timesReceiver: message for 2 timesSender: message for 3 timesReceiver: message for 3 timesSender: message for 4 timesReceiver: message for 4 timesSender: message for 5 timesReceiver: message for 5 times
Sender: message for 1 timesSender: message for 2 timesReceiver: message for 2 timesSender: message for 3 timesReceiver: message for 3 timesSender: message for 4 timesReceiver: message for 4 timesSender: message for 5 timesReceiver: message for 5 times
socket_unix.c
- 进程笔记2:进程之间的通信(UNIX域套接字socket)
- 进程笔记2:进程之间的通信(UNIX域套接字socket)
- 进程笔记2:进程之间的通信(UNIX域套接字socket) .
- 进程间通信(六):unix域套接字
- 进程之间的通信--套接字(网络部分)
- unix进程间通信方式(下)-unix域套接字
- Linux高级进程间通信:UNIX域套接字
- unix域套接字-高级进程间通信
- Understanding Unix/Linux Programming 笔记:chapter 11:连接到近端或远端的进程:服务器与Socket(套接字)
- linux进程间通信--socket套接字
- linux进程间通信--socket套接字
- linux进程间通信--socket套接字
- 进程间通信(11) - 网络套接字(socket)[2]
- Linux进程间套接字(Socket)通信
- Linux进程间通信-----使用数据报套接字实现两个进程之间的通信
- 进程通信:管道(pipe)和 unix域套接字(socketpair)区别
- 进程通信:管道(pipe)和 unix域套接字(socketpair)区别
- 进程间通信的例子: socket unix
- Android应用–必须知道的ListView
- android sim 卡双卡双待
- Iframe框架自动调节高度
- Bluetooth Core Architecture Blocks (蓝牙核心架构)(一)
- [Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码
- 进程笔记2:进程之间的通信(UNIX域套接字socket)
- 关于127.0.0.1和本机IP的一些知识
- jquery ajax
- C++字符串相关整理
- Qt 下的Tcp和Udp通信小结
- spring hibernate 二级缓存
- Eclipse背景颜色修改
- 【面试题】【c++】 实现只能在堆上实例化的类
- 像素操作