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。但在计算机内部,我们通过索引来使用接口。

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

本地命名空间:

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

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

#include <sys/socket.h>
int PF_LOCAL
int PF_UNIX
int PF_FILE

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

#incude <sys/un.h>

struct sockaddr_un {
short int sun_family;
char sun_path[];
}

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

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

int SUN_LEN(struct sockaddr_un *ptr)

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

创建一个本地socket实例:

#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h> int make_named_socket (const char *filename)
{
struct sockaddr_un name;
int sock;
size_t size; /* Create the socket */
sock = socket (PF_LOACAL, SOCK_DGRAM, );
if (sock < )
{
perror ("socket");
exit (EXIT_FAILURE);
} /*Bind a name to the socket.*/
name.sun_family = AF_LOCAL;
strncpy (name.sun_path, filename, sizeof (name.sun_path));
name.sun_path[sizeof(name.sun_path)-] ='\0'; /* The size of the address is the
offset of the start of the filename,
plus its length (not including the terminating null byte).
Alternatively you can just do:
size = SUN_LEN(&name);
*/
size = (offsetof (struct sockaddr_un, sun_path)) + strlen (name.sun_path)); if (bind (sock, (struct sockaddr_un *) &name, size) < )
{
perror ("bind");
exit (EXIT_FAILURE);
} return sock; }

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. 问题:glGenBuffers()函数没有定义怎么办

    链接glew.lib库,#include <gl/glew.h>. glew是opengl 的扩展库

  2. 【caffe-windows】 caffe-master 之 mnist 超详细

    本教程尽量详细,大多步骤都有图,如果运行出错,请先对照自己的文件是否和图上的一样,包括标点啊,空格啊,斜杠,反斜杠啊之类的小细节. 第一步:   官网下载mnist数据 http://yann.lec ...

  3. 如何绕过CDN找源站ip?

    这是一个总结帖,查了一下关于这个问题的国内外大大小小的网站,对其中说的一些方法总结归纳形成,里面具体发现ip的方法不是原创,所有参考的原贴都也贴在了后面,大家可以自行看看原贴. 首先,先要明确一个概念 ...

  4. RC振荡器与有源滤波器1

    自我总结,有错误欢迎指出! 一.振荡器原理: 对于正反馈,有如下公式: 讨论: 1.当A*F(jw)=1时 Af→∞(物理意义:自激振荡): 2.在f0上,F(jw)相移为0或2n∏:(因此,在f0处 ...

  5. Android中各组件的生命周期

    1.Activity生命周期图 二.activity三种状态 (1)active:当Activity运行在屏幕前台(处于当前任务活动栈的最上面),此时它获取了焦点能响应用户的操作,属于活动状态,同一个 ...

  6. 二模08day2解题报告

    T1.引爆炸弹(bomb) N个炸弹构成一棵树,引爆一颗叶节点,会一直引爆到根节点.每颗炸弹有一个价值,求引爆k个炸弹的最大价值. 既然是一棵树,那么自然想到dp.所以先树形dp了一遍(由于可能出现多 ...

  7. 使用ffmpeg快速生成视频截图

    1 ffmpeg -i input.mkv -ss 00:10:00 -f image2 output.jpg 但是这个命令会花费相当长的时间. 对一个清晰的或者较大的视频文件进行操作, 会花费半分钟 ...

  8. 法线贴图——Normal Mapping

    对于不曾学过.用过法线贴图的人来说,提到法线贴图,经常会提到的问题是什么是法线贴图?法线贴图用于解决什么问题?法线贴图的原理是什么?本文将就这三个问题阐述本人的一些见解,各位不喜勿喷!!! 谈到法线贴 ...

  9. how to extract and decrypt WeChat EnMicromsg.db on Android phone

    One of my friend came to me with an Android phone. She saild somehting wrong with the hardware of he ...

  10. oracle split

    select * from table(fun_strsplit('1,2,3,4,5')); 1.创建一个类型 ) 2.创建函数 CREATE OR REPLACE FUNCTION Fun_Str ...