GUN C中的socket学习(一)

  socket是用于通信的工具。

  套接字其实是一个广义上的进程间通信的信道。就像pipe一样,在GUN环境下socket也被用一个文件表示。不同的socket文件可以用于不同的进程间通信,甚至可以用来在网络通信中不同主机之间的进程间通信(比如,我们的浏览器进程与某台服务器上监听80端口的进程通信完成web请求)。socket是与其他主机通信的主要手段,相关软件有telnetrloginftptalk 等。

  并不是所有的机器都支持socket通信,不过在GUN C库中,头文件<sys/socket.h>无论是否存在,socket函数总是可用的,不过在机器不支持时,这些函数总会失败。

  1:socket套接字概念

    创建套接字时,必须指定通讯方式和通讯类型。创建socket时的协议决定了在套接字上发送和接收数据时的用户级别的语义。socket通讯类型回答了一下问题:

      数据的传输单位是什么?一些通信方式将数据视为较大结构的字节序列;其他人将字节分组成数据包

      数据在正常运行时可能丢失吗? 一些通信方式保证发送的所有数据按照发送的顺序到达(禁止系统或网络崩溃); 其他样式偶尔会丢失数据作为正常操作部分,有时可能会传送数据包不止一次或错误的顺序。设计使用不可靠通信方式的程序通常需要采取预防措施来检测丢失或错误的数据包,并根据需要重新发送数据。

      是否需要啊建立连接?一些通讯方式要求必须建立起连接通道才可以通信,有的则不需要。

    当创建一个套接字时,还必须制定一个NAMESPACE,socket("address")也只有在特定命名空间的上下文中才有意义。事实上,甚至数据类型也可能取决于命名空间。命名空间也称为“域”,也就是domain。但是我们应该避免使用这个词,因为它可能会与其他感念混淆。每一个命名空间都有一个以“PF_”开头的符号名称。以“AF_”开头的相应符号名称指定该命名空间的地址格式。

    最后,在建立连接时必须制定使用的协议。该协议确定用于发送和接收数据的低级机制。每个协议对于特定的命名空间和通信风格是有效的;命名空间有时被称为协议族,因为这是为什么命名空间名称以“PF_”开头。

    协议的规则适用于两个程序之间的数据传递,也许在不同的计算机上;大多数这些规则由操作系统处理,您不需要知道它们。需要了解的协议是什么?

    为了在两个socket之间进行通信,它们必须指定相同的协议。
    每个协议对于特定的样式/命名空间组合是有意义的,不能与不适当的组合一起使用。例如,TCP协议仅适用于通信的字节流风格和Internet命名空间。
    对于风格和命名空间的每个组合,都有一个默认协议,您可以通过指定0作为协议号来请求。这就是通常应该做的 - 使用默认值。
  在以下各个地方的描述中,需要用于表示尺寸的变量/参数。这里麻烦开始了。在第一个实现中,这些变量的类型只是int。在当时的大多数机器上,一个int是32位宽,这创建了一个事实上的标准,需要32位变量。这是重要的,因为这种类型的变量的引用被传递给内核。

    然后,POSIX组织来到并统一了界面,其中的“所有大小的值都是size_t”。在64位机器上,size_t是64位宽,所以不能再指向变量。

    Unix98规范通过引入一个类型socklen_t来提供一个解决方案。在POSIX更改为使用size_t的所有情况下都使用此类型。这种类型的唯一要求是它是至少32位的无符号类型。因此,需要传递对32位变量的引用的实现可以像使用64位值的实现。

  2:通讯方式

    GUN C库包括对不同套接字的支持,每个套接字有不同的属性。以下符号常量在<sys/socket.h>中定义

    宏:int SOCK_STREAM:这种方式就像是Pipes和FIFOs

    宏:int SOCK_DGRAM:用于不可靠的发送单独寻址的数据包,与SOCK_STREAM相反。每次向这种套接字写入数据时,该数据都会被打包成一个数据包。由于SOCK_DGRAM套接字没有连接,因此必须在每个数据包指定收件人地址。

    系统对要传输的数据唯一的保证是,它会尽力传递每一个数据包。如果在第四个,第五个数据包出现故障之后,它可能成功发送第六个第七个数据包,第七个数据包可能在第六个数据包之前到达。SOCK_DGRAM的典型用途是在合理的时间内没有看到响应的情况下简单地重新发送数据包是可以接受的。点此查看详情

    宏:int SOCK_RAW:这种风格提供对低级网络协议和接口的访问。普通用户程序通常不需要使用这种风格。

  3:socket地址

    套接字的名称通常称为地址。用于处理套接字地址的函数和符号名称不一致。有事使用术语“名称”,有时称为“地址”。可以讲这些视为同义词。

    使用socket函数创建一个套接字时没有地址,其他进程只有给它一个地址时才可以找到与它通信。我们将这个过程称为绑定到套接字,在C用使用bind函数实现。

    只需要关心套接字的地址,如果其他进程要找到它并开始与其通信。可以指定其他套接字的地址,但这通常是无意义的;首次从套接字发送数据,或者使用它来启动连接时,如果没有指定一个地址,系统会自动分配一个地址。

    偶尔,客户端需要指定地址,因为服务器基于地址进行区分;例如,rsh和rlogin协议查看客户端的套接字地址,只有在小于IPPORT_RESERVED(请参阅端口)时才会旁路密码检查。

    关于命名空间可以查阅Local NamespaceInternet Namespace。无论命名空间如何,都是用相同的bind、getsocketname来设置一个套接字的地址。在实际中,地址格式存在一些特定的数据结构中,当bind时将其转换为struct sockaddr *。

时间: 2024-10-18 07:38:57

GUN C中的socket学习(一)的相关文章

java 中,socket学习

服务端代码: package tt; import java.io.*; import java.net.*; public class Server { public static void main(String args[]) { ServerSocket server = null; Socket you = null; DataOutputStream out = null; DataInputStream in = null; try { server = new ServerSoc

C++ Socket 学习笔记

Socket学习笔记 以下均为整理,做参考之用. IP Address IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异. IP地址被用来给Internet上的电脑一个编号.大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信.我们可以把"个人电脑"比作"

socket学习及各类错误码(部分转)

如果本地有多个网卡(即多个ip),要指定本地发送网卡,则在建立的socket上bind所指定的网卡进行connect和send操作.例子程序如下: #include <stdio.h>#include "WinSock2.h"#pragma comment(lib,"ws2_32.lib") SOCKET tcp_socket;SOCKADDR_IN tcpAddr;const int BufLen=1024;char SendBuf[BufLen];

Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

这段时间在学习Android的socket编程,我不是专做APP的,做的是bootloader.驱动.hal.framework这个线的,也就是系统搭建和功能优化设计.为了打通这整条线,为此学习了不少东西,今天把Android的socket学习记录一下,以防止以后会出现这样的低级错误. 我这里是在极客学院的源码基础上做的自己的一些添加和修改,学习开始不就是先会修改么,举一反三,自然就很快学会了.由于看过视频和资料后就迫不及待的按照自己的想法想做一个功能,但是遇到麻烦了,就是执行new socke

在火狐插件中使用socket编程与java进行通信

之所以要写这篇博文,是因为我在平时使用selenium这个组件的时候,关于浏览器tab页管理这个问题让我极为头痛,而且一直也没得到很好的解决.selenium这个组件非常强大,但它的这个浏览器窗口管理机制让它在我心目中直接从100分扣到80.因为这个问题,我今天学习了一下在firefox addon中使用socket监听我的java请求,然后由我自己来调用firefox的tabs api进行tab页的管理.有兴趣的朋友可以看下! 首先要熟悉几个socket相关的核心xpcom组件 nsiServ

PHP中的Libevent学习

[email protected],1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libevent 扩展模块安装 4.      Libevent常量及php函数 5.      Select/poll模型 6.      epoll/kqueue模型 1. libevent介绍 libevent是一个事件触发的网络库,适用于windows.linux.freebsd等多种平台,内部

详细讲解nodejs中使用socket的私聊的方式

详细讲解nodejs中使用socket的私聊的方式 在上一次我使用nodejs+express+socketio+mysql搭建聊天室,这基本上就是从socket.io的官网上的一份教程式复制学习,然后,根据国情,我又在其中加入了私聊点对点,然后共享画图的你画我猜功能. 先上效果图: 由于本人太穷,所以服务器和数据库都是使用的国外免费的.域名是我的,它的访问地址是:http://chat.lovewebgames.com 先说下我对socket.io的理解,websocket更像是开启了一个端口

Android基础入门教程——7.6.1 Socket学习网络基础准备

Android基础入门教程--7.6.1 Socket学习网络基础准备 标签(空格分隔): Android基础入门教程 本节引言: 为了照顾没学过Java Socket的初学者,或者说捋一捋Android开发中涉及到的网络协议相关的概念, 毕竟面试的时候,面试官来了句给我说下网络协议有几层?那么IP协议在哪层?Socket是什么鬼? 分哪几种?TCP和UDP协议又在哪层?有什么区别-嗯,这-所以学习本节概念性的理论还是很有 必要的!那么话不多说,开始本节内容~ 1.OSI七层网络模型浅析 当然,

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序. 餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个