socket套接字和管道同样可以提供进程内通信。但套接字更胜一筹,不同的进程可以跨越不同的主机(说白了,支持网络通信)。使用套接字的知名程序:telnet、rlogin、ftp等。

  你需要知道的一些基本原理:

  使用socket时必须指定通信的类型和协议。

  通信类型决定了以下内容:1、数据传输的基本单元(有的会打包传输,有的作为一个结构体);2、数据是否可丢失,数据传输的可靠性:(有的数据丢失一两个便不可读了,有的数据如视频不受太大影响);3、是一对一的通信还是一对多的通信。

  每一个socket必须有一个命名空间,命名空间一般以PF_开头,AF_开头的符号名指定命名空间的地址格式。

你需要了解的协议内容

  要让两个socket能够通信,必须指定相同的协议。

  协议和命名空间、通信风格是绑定的。比如TCP协议只能用在stream风格的通信中,Internet的命名空间中。对于指定的命名空间,请使用默认协议(不同的协议、命名空间组合可能会出错)

  

SOCKET几种通信风格:

int SOCK_STREAM: 提供可靠的通信方式。有连接。

int SOCK_DGRAM: 和SOCK_STREAM相反,使用的是不可靠通讯方式。无连接,每一个数据包都必须指定地址。一般来说,丢包的时候需要重发数据包。

int SOCK_RAW:  这种风格允许我们访问底层网络协议和接口,一般来讲我们不需要使用这种风格。

SOCKET地址:

  实际上Socket地址就是socket的名字。在这里地址和名字是同义词。只有把地址和socket绑定后,我们才可以使用socket通信。

网络接口名:

  每一个网络接口都有个名字如:lo、eth0。但在计算机内部,我们通过索引来使用接口。

  1. #include <net/if.h>
  2. size_t IFNAMESIZE //常量:定义了保存接口名的最大buffer大小。(包含了最后zero 结束字节)
  1. unsigned int if_nametoindex (const char *ifname)
  2. //通过接口名返回该接口的索引号,如果不存在该接口名则返回0。也可以用来判断一个接口是否存在。
  1. char * if_indextoname (unsigned int ifindex, char *ifname)
  2. //将接口索引号ifindex和接口名ifname映射起来。如果索引无效,返回空指针,否则返回接口名。
  1. struct if_nameindex
  2. //用来保存某个接口的信息。
  3.  
  4. /*成员如下:*/
  5.  
  6. unsigned int if_index
  7. //接口索引
  8.  
  9. char *if_name
  10. //接口名(以NULL结尾)
  1. struct if_nameindex * if_nameindex(void)
  2. //返回一个if_nameindex结构体的数组(包含了所有的网络接口)。结束标志:接口索引为0,接口名为空指针。
  3. //返回的结构体必须用if_freenameindex释放
  1. void if_freenameindex (struct if_nameindex *ptr)
  2. //解释如上

本地命名空间:

  符号名为PF_LOCAL。本地命名空间也被称之为Unix域套接字。另外一个名字是file namespace(socket 地址常被实现为文件名)

  本地socket无法被其他机器连接(即便其他机器共享了包含本地socket的文件系统)。其他机器可以共享的文件系统查看到scoket文件,但无法连接。关闭本地命名空间的socket,建议同时删除socket文件。本地命名空间只支持一种协议(不管通信风格),协议号是0。

  1. #include <sys/socket.h>
  2. int PF_LOCAL
  3. int PF_UNIX
  4. int PF_FILE

以上几个都是宏常量,而且都是同义词。这些常量用来指定本地命名空间。

  1. #incude <sys/un.h>
  2.  
  3. struct sockaddr_un {
  4. short int sun_family;
  5. char sun_path[];
  6. }

sun_family:标志了地址族和socket 地址的格式。在本地命名空间中,使用AF_LOCAL。

sun_path[108]:socket使用的文件名(很奇怪为何是108个字节,理查德·马修·斯托曼推荐使用alloca来申请适当大小的空间存储文件名。并将该数组长度设置为0)

  1. int SUN_LEN(struct sockaddr_un *ptr)

SUN_LEN是宏定义的函数,用来计算本地命名空间中socket地址的长度。实际为结构体sockaddr_un的大小。

创建一个本地socket实例:

  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/socket.h>
  7. #include <sys/un.h>
  8.  
  9. int make_named_socket (const char *filename)
  10. {
  11. struct sockaddr_un name;
  12. int sock;
  13. size_t size;
  14.  
  15. /* Create the socket */
  16. sock = socket (PF_LOACAL, SOCK_DGRAM, );
  17. if (sock < )
  18. {
  19. perror ("socket");
  20. exit (EXIT_FAILURE);
  21. }
  22.  
  23. /*Bind a name to the socket.*/
  24. name.sun_family = AF_LOCAL;
  25. strncpy (name.sun_path, filename, sizeof (name.sun_path));
  26. name.sun_path[sizeof(name.sun_path)-] ='\0';
  27.  
  28. /* The size of the address is the
  29. offset of the start of the filename,
  30. plus its length (not including the terminating null byte).
  31. Alternatively you can just do:
  32. size = SUN_LEN(&name);
  33. */
  34. size = (offsetof (struct sockaddr_un, sun_path)) + strlen (name.sun_path));
  35.  
  36. if (bind (sock, (struct sockaddr_un *) &name, size) < )
  37. {
  38. perror ("bind");
  39. exit (EXIT_FAILURE);
  40. }
  41.  
  42. return sock;
  43.  
  44. }

linux C socket的更多相关文章

  1. linux中socket的理解

    对linux中socket的理解 一.socket 一般来说socket有一个别名也叫做套接字. socket起源于Unix,都可以用“打开open –> 读写write/read –> ...

  2. linux 客户端 Socket 非阻塞connect编程

    开发测试环境:虚拟机CentOS,windows网络调试助手        非阻塞模式有3种用途        1.三次握手同时做其他的处理.connect要花一个往返时间完成,从几毫秒的局域网到几百 ...

  3. Linux内核socket优化项

    Linux内核socket优化项 vi /etc/sysctl.confnet.core.netdev_max_backlog = 30000  每个网络接口接收数据包的速率比内核处理这些包的速率快时 ...

  4. 提高 Linux 上 socket 性能

      http://www.cnblogs.com/luxf/archive/2010/06/13/1757662.html 基于Linux的Socket网络编程的性能优化   1 引言    随着In ...

  5. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  6. Linux下Socket编程的端口问题( Bind error: Address already in use )

    Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...

  7. linux多线程socket编程一些心得

    http://hi.baidu.com/netpet/blog/item/2cc79216d9012b54f2de32b9.html 前段时间将新的web模型办到linux上来,用epoll代替了IO ...

  8. linux c socket programming

    原文:linux c socket programming http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http:/ ...

  9. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  10. Linux C socket 封装

    /************************************************************************** * Linux C socket 封装 * 声明 ...

随机推荐

  1. Android 中获取 debug 测试 SHA1 和 release SHA1 证书指纹数据的方法

    百度地图开发的时候要申请KEY,需要提供SHA1证书指纹数据 Eclipse eclipse中直接查看:windows -> preferance -> android -> bui ...

  2. JMeter的定时器

    JMeter的十种定时器 先明确一些概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后,不管这个定时器的位置放在sampler之后,还是之前.2)定时器是有作用域的:当执行一个sa ...

  3. c# 控制服务启动停止

    public string StartService(string serviceName, bool serviceFlag) { try { using (System.ServiceProces ...

  4. C++异常:no matching function for call to "Matrix(Matrix&)"

    C++异常:no matching function for call to "Matrix(Matrix&)" 我定义了一个类叫Matrix,其中构造函数explicit ...

  5. Lamp源码包安装实录

    Lamp源码包安装实录 附件中是安装步骤,下载站点里包含视频(http://down.51cto.com/data/460776) 本文出自 "李晨光原创技术博客" 博客,请务必保 ...

  6. 开源项目:网页实时通信WebRTC

    参考资料 [博客系列] Android WebRTC 音视频开发总结 [环境编译] WebRTC入门指南 各平台WebRTC源码网盘下载 Ubuntu14.04编译WebRTC For Android ...

  7. leetcode 67

    67. Add Binary Given two binary strings, return their sum (also a binary string). For example,a = &q ...

  8. Android IOS WebRTC 音视频开发总结(四五)-- ORTC背后的真相

    本文主要介绍ORTC(Object Real-time Communication),支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. - ...

  9. s3c6410_uart初始化及读写

    参考: 1)<USER'S MANUAL-S3C6410X>第31章 UART 2)u-boot uart初始化及读写:u-boot-x.x.x/board/samsumg/smdk641 ...

  10. centos下网络的基本配置方法讲解

    上一篇中我们已经成功安装了我们的centos系统,但是我们可能发现我们安装的centos上不了网,所以这一章我们来说说如何配置centos来连接外网和局域网. 我们首先来认识一下linux下部分网络配 ...