最近开始研究使用Socket API来网络编程,想着把自己的感想、感悟写下来。我发现在编程之外还有不少概念性的东西要学习。我觉得应该有以下几点吧:

1.得了解下计算机网络的基本概念,如OSI的7层模型,TCP/IP协议,地址端口等。TCP/IP协议相关的知识推荐看国外的教材;

2.了解计算机网络中两个结点之间通信的基本过程,以及IP地址、端口的基本概念。比如应用层的数据如何通过传输层协议包装,再通过IP层协议包装等等;

3.使用Socket API编程的基本流程和技术思路;

在使用Socket API编程时,需要重点先了解几个API,包括:socket、accept()、bind()、connect()等。关于这几个函数的解释,我觉得国外的英文解释是最准确的了,因此我想着把英文翻译出来,希望对学习Socket网络编程的朋友有帮助。

本篇翻译的socket()函数,我参考的国外网站是:

socket()函数

朋友们可以自由转载我对英文的中文翻译,但是对于“作者注:”的描述,转载时请注明出处和作者,否则视为侵权。

下面是翻译的正文,由于水平有限,有些翻译的不好,有些未能翻译出,恳请读者指出与见谅。

NAME

socket - create an endpoint forcommunication

socket,为通信创建一个终端点;

SYNOPSIS

#include <sys/socket.h>

int socket(int domain, int type, intprotocol);

socket函数声明是在头文件<sys/socket.h>中。函数包含三个参数:domain,type,protocol;

DESCRIPTION

The socket() function creates an unboundsocket in a communications domain, and returns a file descriptor that can beused in later function calls that operate on sockets.

socket()函数在一个通信域创建了一个未被绑定的套接字,此函数返回一个文件描述符。这个文件描述符会被其他的函数调用。这些函数都要在套接字上做一些操作。

作者注:

1.socket()函数会创建一个socket文件,并且返回了一个文件描述符。在Linux中,一切都是文件。既然是文件,肯定要有一个东东来标记它,而且还是唯一的标记。函数返回的文件描述符就是这样一个标记。

2.返回的文件描述符是一个int型数据,用来标记创建的socket;

3.由于创建的socket是一个文件,所以socket就可以被用来读、写等I/O文件操作。谁来执行这些操作呢?就是所翻译的“其他的函数”,比如bind()等函数。这些函数的参数往往第一个就是socket()函数返回的文件描述符,也就是引用文件描述符来使用socket。至于socket这个东东如何从形象的角度来理解,作者想了一个比方,附在文末。

The function takes the following arguments:

socket()函数的参数如下:

domain

Specifies the communications domain inwhich a socket is to be created.

参数domain:指定了一个socket在哪个通信域被创建。

作者注:

我觉得其实就是指定了这个socket将来要使用的是IPV4地址,还是IPV6地址等。

type

Specifies the type of socket to be created.

参数type:指定了被创建的socket的类型;

protocol

Specifies a particular protocol to be usedwith the socket. Specifying a protocol of 0 causes socket() to use anunspecified default protocol appropriate for the requested socket type.

参数protocol:指定了套接字需要用到的某个特殊的协议。如果此参数为0,则会导致socket()函数使用一个未指定的默认的协议,默认协议适用于请求的套接字类型。

作者注:

如果protocol参数为0的话,则参数type是什么类型,那么参数protocol就是此类型默认使用的协议。比如type是SOCK_STREAM类型,那么protocol默认就是TCP协议。

The domain argument specifies the addressfamily used in the communications domain. The address families supported by thesystem are implementation-dependent.

参数domain指定了在通信域里使用的地址族。此地址族是依赖于所使用的系统实现。

作者注:

比如有的系统不支持IPV6,就算domain参数指定了是IPV6,系统也用不了。

The <sys/socket.h> header defines atleast the following values for the domain argument:

关于domain参数的值,<sys/socket.h>头文件定义了至少如下几个值:

AF_UNIX

File system pathnames.

AF_UNIX值:是文件系统路径名;

AF_INET

Internet address.

AF_INET值:是网络地址。

作者注:

AF_INET表示socket会用IPV4地址来通信。IPV4地址采用32位。

The type argument specifies the sockettype, which determines the semantics of communication over the socket. Thesocket types supported by the system are implementation-dependent. Possiblesocket types include:

参数type指定了套接字的类型,套接字的类型决定了在套接字上进行通信时的通信语义。可能的套接字类型包括:

SOCK_STREAM

Provides sequenced, reliable,bidirectional, connection-mode byte streams, and may provide a transmissionmechanism for out-of-band data.

SOCK_STREAM:此种类型提供了有序的,可依赖的,双向的,字节流连接模式,而且可能为out-of-band数据提供一种传输机制。

作者注:

1. SOCK_STREAM:应该就是使用的是TCP协议。TCP协议就是一种面向连接的可靠的协议,保证传输数据不会丢失。只要有数据丢失,则通信双方会继续传输丢失的数据,所以TCP协议效率上可能会打点折扣。

2. out-of-band我不知该如何翻译。可能是说,SOCK_STREAM提供的传输机制可以保证丢失的数据再找回来吧。

SOCK_DGRAM

Provides datagrams, which areconnectionless-mode, unreliable messages of fixed maximum length.

SOCK_DGRAM:此种类型提供了数据报文,这种报文是面向未连接的,不可靠的信息,且是固定的最大长度。

作者注:

比如使用UDP协议就是一种面向未连接的方式,通信双方传信时丢了数据也不管,所以传输效率上比TCP协议要高一些。

SOCK_SEQPACKET

Provides sequenced, reliable,bidirectional, connection-mode transmission path for records. A record can besent using one or more output operations and received using one or more inputoperations, but a single operation never transfers part of more than onerecord.
Record boundaries are visible to the receiver via the MSG_EOR flag.

SOCK_SEQPACKET:此种类型为记录提供了有序的,可靠的,双向的,面向连接的传输路径。一个记录可以用一个或多个输出操作将其发出去,也可以使用一个或多个输入操作将其接收,但是一个单独的操作永远不会传输part of more than one record.记录的边界通过“MSG_EOR”标记对接受者而言是可见的。

If the protocol argument is non-zero, itmust specify a protocol that is supported by the address family. The protocolssupported by the system are implementation-dependent.

如果protocol参数是非0的数,那么一定要为此参数指定一个地址族支持的协议。系统支持的协议是依赖于该系统的。

作者注:

“type”参数与“protocol”参数不是随便组合的。比如,“type”是SOCK_STREAM时,“protocol”一定得是TCP协议。

The process may need to have appropriateprivileges to use the socket() function or to create some sockets.

进程也许需要合适的授权来使用socket()函数,或者进程需要创建一些套接字。

RETURNVALUE

Upon successful completion, socket()returns a nonnegative integer, the socket file descriptor. Otherwise a value of-1 is returned and errno is set to indicate the error.

ERRORS

一旦函数成功执行,socket()会返回一个正数,也就是套接字文件描述符。否则,就会返回-1,而且会有errno会被用来说明发生了什么错误。

The socket() function will fail if:

socket()函数会由于以下原因执行失败:

[EAFNOSUPPORT]

The implementation does not support thespecified address family.

实现不支持指定的协议族。

[EMFILE]

No more file descriptors are available forthis process.

此进程没有更多可用的文件描述符。

[ENFILE]

No more file descriptors are available forthe system.

系统没有更多可用的文件描述符。

[EPROTONOSUPPORT]

The protocol is not supported by theaddress family, or the protocol is not supported by the implementation.

地址族不支持指定的协议,或者协议不被实现所支持;

[EPROTOTYPE]

The socket type is not supported by theprotocol.

套接字类型不被协议所支持。

The socket() function may fail if:

socket()函数会由于以下原因可能会失败:

[EACCES]

The process does not have appropriateprivileges.

进程没有相应的权限。

[ENOBUFS]

Insufficient resources were available inthe system to perform the operation.

系统中没有足够的资源来执行操作。

[ENOMEM]

Insufficient memory was available tofulfill the request.

没有足够的内存来满足要求。

[ENOSR]

There were insufficient STREAMS resourcesavailable for the operation to complete.

操作要完成,但是没有足够的流资源。

APPLICATIONUSAGE

The documentation for specific addressfamilies specify which protocols each address family supports. Thedocumentation for specific protocols specify which socket types each protocolsupports.

具体的地址族的文档指定了每个地址族支持哪些协议。具体协议的文档指定了每一个协议支持哪些套接字类型。

The application can determine if an addressfamily is supported by trying to create a socket with domain set to theprotocol in question.

不知如何翻译。

作者注:

作者一直在思考该怎么从形象的角度来理解socket这个概念,想了几天,遂想出一个比喻,岁不太贴切,但也可帮助理解。

从英文单词来看,此socket单词的意思是“插座”,也就是老外拿插座这个日常用品来描述socket编程。我们都知道的,插座提供了几个插孔为家用电器提供电力,家用电器的电源适配器插在插座上,插座再通过自己的电源线从总电源处获取电力。那么用来类别socket编程,就好像将通信的电脑插在一个socket上,电脑通过这个socket来获取网络上的数据,或者把数据发到网络上。比如我的电脑要跟小张电脑通信,编程时,将一个socket绑在我的电脑上,socket从小张电脑获取数据,再给到我,就好像插座从总电源获取电力,再给我的电脑供电。而且,我的电脑还能把数据发给socket,由socket把数据发给小张的电脑,就好像我的电脑把自己的电力给了插座,插座又给了总电源,虽然这个是不可能的啦!

这样一比喻的话,就比较好理解老外为何在网络编程领域提出socket的概念了。估计老外也是根据插座提供电力这个想到的吧。

Socket编程(C语言实现):socket()函数英文翻译的更多相关文章

  1. Socket编程(C语言实现):bind()函数英文翻译

    本篇翻译的bind()函数,我参考的国外网站是: bind 朋友们可以自由转载我对英文的中文翻译,但是对于"作者注:"的描述,转载时请注明出处和作者,否则视为侵权. 下面是翻译的正 ...

  2. Socket编程:listen()函数英文翻译

    作者:C语言达人 链接:https://zhuanlan.zhihu.com/p/24951131 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇翻译的list ...

  3. iOS Socket编程-C语言版(UDP)

    . UDP Socket编程 先讲一讲UDP编程,因为比TCP要简单多了.首先,我们需要明白UDP是用户数据报协议,英文名为User Datagram Protocol,它是面向无连接的. 注意:So ...

  4. iOS Socket编程-C语言版(TCP)

    . TCP Socket编程 TCP是面向连接的,安全可靠的传输层协议.TCP的程序基本框架设计图: TCP的程序基本框架设计图.jpg 注意:Socket通信一定有要服务端和客户端. 1.1 TCP ...

  5. socket编程:recvmsg 和 sendmsg 函数

    背景 复习 socket 编程的时候发现了以前没有留意到的 2个函数:recvmsg 和 sendmsg ref : Linux编程之recvmsg和sendmsg函数 知识 先来看看函数原型: #i ...

  6. C# Socket编程(5)使用TCP Socket

    TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...

  7. 【转】C# Socket编程(5)使用TCP Socket

    [转自:https://www.cnblogs.com/IPrograming/archive/2012/10/18/CSharp_Socket_5.html] TCP 协议(Transmission ...

  8. python socket 编程之一:编写socket的基本步骤

    一.socket 编写server的步骤: 1.第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family ...

  9. Go 语言官方包函数中文翻译

    Go官方包函数中文翻译 *** import "strings" func Join(a []string, sep string) string Join concatenate ...

随机推荐

  1. Win10《芒果TV》商店版更新v3.2.6:修复后台任务故障,优化推送频次

    2017湖南卫视大型音乐竞技节目<歌手>,2017年1月21日晚首播第一期,7位歌手惊艳亮嗓,<芒果TV>UWP版迅速更新v3.2.6版,主要是修复后台任务故障,优化推送频次, ...

  2. Android零基础入门第1节:Android的前世今生

    原文:Android零基础入门第1节:Android的前世今生 现在网上有很多各色Android资料了,但相对来说还是比较零散,Android覆盖的范围极广,最近刚好有机会全部拉通整理一遍,也保存起来 ...

  3. Android动画基础——属性动画(Property Animation)

    本篇涉及例子下载:Github 本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉 ...

  4. UWP访问KnownFolders.RemovableDevices时(读取U盘文件)抛出异常UnauthorizedAccessException

    读取U盘的文件时: StorageFile file = await folder.GetFileAsync("myfile.txt"); 抛出异常System.Unauthori ...

  5. enum 枚举一般用法 dotnet

    public enum Demo { [Description("Moning描述")] Moning = , [Description("Afternoon描述&quo ...

  6. 创建第一个ASP.NET MVC项目

    创建 新建->项目->展开Web->ASP.NET Web应用程序->MVC->确认 ASP.NET MVC应用程序的目录结构 /Controllers该目录保存处理UR ...

  7. 百度网盘web端项目总结

    项目背景 网盘作为一个在线备份存储,共享文件的工具类产品,给人们的工作和生活带来了很大的帮助和便利.百度网盘是目前国内使用量最大的网盘产品,至今发展已有4年,总用户数超4亿,为了让用户有着更好的使用体 ...

  8. Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)

    前话:  其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...

  9. 使用 acl 编写 UDP 网络程序(UDP 重传及可靠性机制)

    在当今网络世界,虽然大部分网络应用都是基于 TCP 的,但有时 UDP 的网络通信也有用武之处.acl 的网络库中不仅提供了基于 TCP 的网络套接字流,同时也提供了 UDP 的网络库(目前 acl ...

  10. 插件化二(Android)

    插件化二(Android) 上一篇文章<插件化一(android)>里大概构思了下插件加载与校验的流程和一些大体设计,这次就具体展开,在<动态加载与插件化>里提到以apk形式开 ...