在Ubuntu下实现本地套接字(socket)通信以及遇到的问题!
来源:互联网 发布:黄药师软件多少钱 编辑:程序博客网 时间:2024/05/08 09:59
客户端:client.c
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<sys/un.h>#include<unistd.h>#include<stdlib.h>int main(){int sockfd;int len;struct sockaddr_un address;int result;char ch='A';sockfd=socket(AF_UNIX,SOCK_STREAM,0);address.sun_family=AF_UNIX;strcpy(address.sun_path,"server_socket");len=sizeof(address);result=connect(sockfd,(struct sockaddr *)&address,len);if(result==-1){perror("oops:client1");exit(1);}write(sockfd,&ch,1);read(sockfd,&ch,1);printf("char from server = %c \n",ch);close(sockfd);exit(0);}
服务端:server.c
#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<sys/un.h>#include<unistd.h>int main(){int server_sockfd,client_sockfd;int server_len,client_len;struct sockaddr_un server_address;struct sockaddr_un client_address;<span style="color:#ff0000;">unlink("server_socket");// 创建本地套接字</span>server_sockfd=socket(AF_UNIX,SOCK_STREAM,0);server_address.sun_family=AF_UNIX;strcpy(server_address.sun_path,"server_socket");server_len=sizeof(server_address);bind(server_sockfd,(struct sockaddr *)&server_address,server_len);listen(server_sockfd,5);while(1){char ch;printf("server watting\n");client_len=sizeof(client_address);client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);read(client_sockfd,&ch,1);ch++;write(client_sockfd,&ch,1);close(client_sockfd);}}
我在ubuntu下运行上述代码时,它会报错:找不到server_socket这个套接字,但同样的代码在centos下能运行,原来是我在ubuntu中运行程序的用户不具有文件的读写权限。
所以我们需要把创建的套接字放在用户都能访问的 /tmp目录下面(如下第一种方法)。
参考网址:http://blog.chinaunix.net/uid-26808060-id-4065810.html
socket进程通信命名方式有两种:
一、普通的命名
socket会根据此命名创建一个同名的socket文件,客户端连接的时候通过读取该socket文件连接到socket服务端。这种方式的弊端是服务端必须对socket文件的路径具备写权限,客户端必须知道socket文件路径,且必须对该路径有读权限。
代码实现:
server_address.sun_family = AF_UNIX; strcpy(server_addr.sun_path,"/tmp/UNIX.domain"); server_len = sizeof(struct sockaddr_un);
二、抽象命名空间
这种方式不需要创建socket文件,只需要命名一个全局名字,即可让客户端根据此名字进行连接。后者的实现过程与前者的差别是,后者在对地址结构成员sun_path数组赋值的时候,必须把第一个字节置0,即sun_path[0] = 0
代码实现:
server_addr.sun_family = AF_UNIX; strcpy(server_addr.sun_path, SERVER_NAME); server_addr.sun_path[0]=0; //server_len = sizeof(server_addr); server_len = strlen(SERVER_NAME) + offsetof(struct sockaddr_un, sun_path);
其中,offsetof函数在#include 头文件中定义。因第二种方式的首字节置0,我们可以在命名字符串SERVER_NAME前添加一个占位字符串,例如:
#define SERVER_NAME @socket_server前面的@符号就表示占位符,不算为实际名称。
0 0
- 在Ubuntu下实现本地套接字(socket)通信以及遇到的问题!
- 基于套接字实现本地进程间的通信
- C++使用socket套接字的通信编程实现
- 本地套接字通信
- socket--套接字通信
- BigMC安装在ubuntu下遇到的问题。(问题分析以及思路)
- 本地缓存的实现以及遇到的问题
- 基于TCP通信的套接字Socket
- 毕业设计辛酸路—在ubuntu下安装mplayer以及遇到的问题
- socket通信的遇到的问题1
- php 本地套接字通信
- 本地套接字domain通信
- Ubuntu下安装和设置JDK以及遇到的问题
- Ubuntu 下安装 Yar 扩展遇到的问题以及解决方案
- Ubuntu 下安装tomcat8.0遇到的问题以及解决办法
- ubuntu下备份系统以及遇到的问题
- socket通信中遇到的问题
- 利用Socket套接字通信
- GraphicBuffer和Gralloc模块
- Navicat Premium for Mac 11.1.8 中文破解版
- 大数乘法
- 共同学习Java源代码--常用工具类--AbstractStringBuilder(八)
- java批量清除文件注释
- 在Ubuntu下实现本地套接字(socket)通信以及遇到的问题!
- (转)平方根的快速算法(sqrt)
- 随机拆分红包
- 大数取余
- 使用springMVC实现文件上传和下载之环境配置与上传
- Android 在开发中使用单元测试
- 图片服务器搭建
- 粗略对比Parquet和Hbase数据存储结构
- 移植u-boot-2016.01到mini2440开发板