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;
}

总结

以上就是本文关于linux IPC之socket解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • linux下socket编程常用头文件(推荐)
  • linux socket通讯获取本地的源端口号的实现方法
  • Linux UDP socket 设置为的非阻塞模式与阻塞模式区别
  • linux中高并发socket最大连接数的优化详解
  • linux下开启php的sockets扩展支持实例
  • 详解Linux Socket编程(不限Linux)
  • Linux下高并发socket最大连接数所受的各种限制(详解)
  • Linux的Socket IO模型趣解
(0)

相关推荐

  • Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进

  • linux下开启php的sockets扩展支持实例

    下个相同版本的php源码,进行编译安装,再按照上面步骤搞,生成的so.copy到rpm装的那个,修改php.ini进行扩展就行了, 或者到网上找相同版本,相同系统 的编译好的so文件. 在linux下给PHP安装socket扩展,参考方法如下: #cd /usr/soft/php/ext/sockets (进入原php安装文件下的sockets目录) #/usr/local/php/bin/phpize (运行安装后的php安装文件下的phpize) #./configure --prefix=

  • linux socket通讯获取本地的源端口号的实现方法

    关于TCP IP网络通讯的资料非常多,TCP IP通过IP数据包模式进行端对端通讯.典型的TCP数据包如下 可以看到数据包包含了源端口号和目的端口号,客户端socket向服务端发起连接时,系统会给socket随机分配一个源端口号,我们可以通过getsocketname来获取连接成功的socket的原端口信息. 函数原型 #include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *addr, socklen_t *ad

  • 详解Linux Socket编程(不限Linux)

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和

  • Linux的Socket IO模型趣解

    前言 之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型: 老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他们的信会被邮递员投递到他们小区门口的收发室里.这和Socket模型非常类似. 下面就以老陈接收信件为例讲解linux的 Socket I/O模型. 一.同步阻塞模型 老陈的女儿第一次去外地工作,送走她之后,老陈非常的挂心她安全到达没有: 于是老陈什么也不干,一直在小区门口收发室里等着她女儿的报平安的

  • linux中高并发socket最大连接数的优化详解

    首先我们可以通过ulimit –a命令来查看系统的一些资源限制情况,如下: # ulimit -a core file size (blocks, -c) 1024 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 127422 max locked memory (kbytes, -l) 64 max memo

  • Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别 UDP socket 设置为的非阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), MSG_DONTWAIT, (struct sockaddr *)&SockAddr,&ScokAddrLen); UDP socket 设置为的阻塞模式 Len = recvfrom(SocketFD, szRecvBuf, sizeof(szRecvBuf), 0, (

  • linux下socket编程常用头文件(推荐)

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函数 netdb.h:提供设置及获取域名的函数 sys/ioctl.h:提供对I/O控制的函数 sys/poll.h:提供socket等待测试机制的函数 其他在网络程序中常见的头文件 unistd.h:提供通用的文件.目录.程序及进程操作的函数 errno.h:提供错误号errno的定义,用于错误处理

  • linux IPC之socket解析及实例代码

    Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信.它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信. socket的创建步骤 服务端 1.通过socket()函数创建socket 2.通过bind函数绑定socket于设备地址 3.通过listen监听指定的socket 4.通过accept等待客户端的连接 客户端 1.通过socket()函数创建socket 2.通过connect连接到服务端 待经过上面的步骤后,服务端和客户端已经建立

  • Linux 中的 Openssl命令及实例代码

    openssl命令的格式是"openssl command command-options args",command部分有很多种命令,这些命令需要依赖于openssl命令才能执行,所以称为伪命令(pseudo-command),每个伪命令都有各自的功能,大部分command都可以直接man command查看命令的用法和功能. OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用.在Ope

  • Linux简易彩色进度条的实例代码

    在实现进度条之前,我们需要先简单了解一些知识: 一.缓冲区: 缓冲区分为无缓冲.行缓冲.全缓冲. 无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr. 行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作.典型的代表是键盘的操作. 全缓冲:表示的是输入输出写满缓冲区才执行I/O操作.典型的代表是磁盘的读写. 所以我们在实现的时候需要每次输出完都需要使用fflush(stdout)将缓冲区刷新,以便下一次的输出. 二.'\r'和 '\n'的区别: 回车用'\r'表

  • C语言实现Linux下的socket文件传输实例

    本文实例讲述了C语言实现Linux下的socket文件传输.分享给大家供大家参考.具体如下: server.c如下: //////////////////////////////////// //服务器代码 /////////////////////////////////// //本文件是服务器的代码 #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include &

  • python 解析XML python模块xml.dom解析xml实例代码

    一 .python模块 xml.dom 解析XML的APIminidom.parse(filename)加载读取XML文件 doc.documentElement获取XML文档对象 node.getAttribute(AttributeName)获取XML节点属性值 node.getElementsByTagName(TagName)获取XML节点对象集合 node.childNodes #返回子节点列表. node.childNodes[index].nodeValue获取XML节点值 nod

  • Linux INotif机制详解及实例代码

    Linux INotif机制 一. 前言: 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如 hotplug.udev 和 inotify 就是这种需求催生的.Hotplug 是一种内核向用户态应用通报关于热插拔设备一些事件发生的机制,桌面系统能够利用它对设备进行有效的管理,udev 动态地维护 /

  • Java使用NIO包实现Socket通信的实例代码

    前面几篇文章介绍了使用java.io和java.net类库实现的Socket通信,下面介绍一下使用java.nio类库实现的Socket. java.nio包是Java在1.4之后增加的,用来提高I/O操作的效率.在nio包中主要包括以下几个类或接口: Buffer:缓冲区,用来临时存放输入或输出数据. Charset:用来把Unicode字符编码和其它字符编码互转. Channel:数据传输通道,用来把Buffer中的数据写入到数据源,或者把数据源中的数据读入到Buffer. Selector

  • Java实现的基于socket通信的实例代码

    服务器端代码: 复制代码 代码如下: import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server {     public static void main(String[] args) {         ServerSocket server;         try{    

  • python socket 聊天室实例代码详解

    python socket 聊天室 import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #绑定端口 s.bind(("127.0.0.1", 8888)) while True: data = s.recvfrom(1024) print(str(data[0].decode("gbk"))) send_data = input("请输入聊天内容") if &quo

  • linux中java获取路径的实例代码

    linux中java获取路径怎么写? 在Unix/Linux中,路径的分隔采用正斜"/",比如"cd /home/java". 在java的代码开发中 \ 是代表转义字符. 相对路径和绝对路径 . 指的是当前目录 .. 指的是当前目录的上一级目录 ./book表示当前目录下的book文件夹 /book表示当前盘符下的book文件夹 Linux绝对路径:以root根目录 / 开始的路径 如 / 表示root根目录 下面,就是Linux中使用Java获取路径的一些操作:

随机推荐