linux IPC之socket解析及实例代码
作者:Jalon007 发布时间:2023-08-27 21:40:12
标签:linux,ipc,socket
Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。
socket的创建步骤
服务端
1.通过socket()函数创建socket
2.通过bind函数绑定socket于设备地址
3.通过listen监听指定的socket
4.通过accept等待客户端的连接
客户端
1.通过socket()函数创建socket
2.通过connect连接到服务端
待经过上面的步骤后,服务端和客户端已经建立了链接,可以通过write/read或者sendto/recvfrom发送/接收数据.
示列
1.服务端
//s_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
struct sockaddr_un clt_addr;
struct sockaddr_un srv_addr;
listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
if(listen_fd<0)
{
perror("cannot create communication socket");
return 1;
}
//set server addr_param
srv_addr.sun_family=AF_UNIX;
strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
unlink(UNIX_DOMAIN);
//bind sockfd & addr
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1)
{
perror("cannot bind server socket");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//listen sockfd
ret=listen(listen_fd,1);
if(ret==-1)
{
perror("cannot listen the client connect request");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//have connect request use accept
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0)
{
perror("cannot accept client connect request");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//read and printf sent client info
printf("/n=====info=====/n");
for(i=0;i<4;i++)
{
memset(recv_buf,0,1024);
int num=read(com_fd,recv_buf,sizeof(recv_buf));
printf("Message from client (%d)) :%s/n",num,recv_buf);
}
close(com_fd);
close(listen_fd);
unlink(UNIX_DOMAIN);
return 0;
}
2.客户端
//c_unix.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
int connect_fd;
int ret;
char snd_buf[1024];
int i;
static struct sockaddr_un srv_addr;
//creat unix socket
connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
if(connect_fd<0)
{
perror("cannot create communication socket");
return 1;
}
srv_addr.sun_family=AF_UNIX;
strcpy(srv_addr.sun_path,UNIX_DOMAIN);
//connect server
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1)
{
perror("cannot connect to the server");
close(connect_fd);
return 1;
}
memset(snd_buf,0,1024);
strcpy(snd_buf,"message from client");
//send info server
for(i=0;i<4;i++)
write(connect_fd,snd_buf,sizeof(snd_buf));
close(connect_fd);
return 0;
}
来源:http://blog.csdn.net/u010657219/article/details/44059073
0
投稿
猜你喜欢
- 10月21日消息,今天下午,PChome电脑之家网站在上海召开了2009年全体员工大会,CBSi全球高级副总裁兼中国区总裁王路、CBSi(中
- 地方门户网站在互联网世界里方兴未艾,各个地方的门户网站“你方唱罢我登场”。最初是省级、市级的地方门户
- PHPWind v7.3.2收藏夹分页链接错误问题解决方法:打开mode/o/m_article.php查找:$pages =&n
- 其实,Windows2000 含有很多的安全功能和选项,如果你合理的配置它们,那么windows 2000将会是一个很安全的操作系统。具体清
- 打开:require/sendemail.php查找第一个(269行左右):fwrite($fp, $msg); 在此行
- 为了庆祝今天ID解封,特发一篇小教程,针对新手的,讲错的地方欢迎指正,下面开始教程. 在网上流传很广,坛子里也有几个人都转过,这里
- 序言偶尔你们会有机会了解一件事情的来龙去脉和其中的内幕,今天你就很幸运,因为我将带你领略当今最热门,同时也可能是你已经熟悉了的技术:万维网。
- 1、Google要整合全球的信息,而中国的信息可能会占据全球信息的30%以上。中国很重要。2、Google有自己的价值观和理想,所以有自己的
- 相信在自己的网站上使用AdSense的朋友都曾遇到过展示英文广告的情况,即使网页内容全部为中文,即使访问用户全部来自中国或中文区域。虽然出现
- 由于众所周知的原因,微软的产品总能吸引黑客们的目光,IIS也不例外。IIS是什么?即因特网信息服务,作为当今流行的Web服务器之一,它提供了
- V5shop网络联盟系统:网商应突破平台壁垒 盈利为王最近,一些具有忧患意识的独立网商经常通过邮件或QQ向笔者咨询,归纳一下,问题基本集中在
- 如果你正在考虑如何通过搜索引擎获得较高的流量,那么关键词一定是对你的工作非常有益的投资。无论你是想要自己做关键词的确定工作,还是雇一个专业人
- 现在网赚其实已经很流行了,但是多数学生只了解其表面,根本不懂其真实内容,记得原来我高中的时候看到有个网站上出现网赚这个词,是发展下线那种的,
- 一、autofs服务简介我们在使用Linux时,如果要访问硬件资源,则需要使用mount命令进行挂载,将硬件资源与一个目录进行对应,然后才可
- site是多数搜索引擎支持的高级语法。它的作用是缩写搜索范围,只在指定的网域中查找。网域可分为下面三种:1、特定的域名类型: 如cn、uk、
- 上周,微软正式宣布了移动平台新品牌Windows Phone。从Windows Mobile 6.5系统开始,用该品牌取代之前的Window
- 做网络营销的很多朋友都知道博客营销,博客营销做好了不仅可以带来更多的IP,同时可以和更多的朋友交流学习,待访问量超高后可以推广产品,但是很多
- 先说今天遇到的一个问题,我在wordpress模板目录下新建了一个PHP文件,service.php,想要调用<?php get_fo
- Linux具有安全、高效、廉价的优点,但大家对它一直有难以使用的印象。其实,随着Linux的不断发展,它的易用性已大有改观。采用Linux操
- 设置群集用户帐户群集服务需要一个属于可运行群集服务的每个节点上的本地管理员(Local Administrators)组成员的域用户帐户。因