Socket編程(C語言實現):socket()函數英文翻譯

最近開始研究使用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 forncommunication

socket,為通信創建一個終端點;

SYNOPSIS

#include <sys/socket.h>

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

socket函數聲明是在頭文件<sys/socket.h>中。函數包含三個參數:domain,type,protocol;

DESCRIPTION

The socket() function creates an unboundnsocket in a communications domain, and returns a file descriptor that can benused 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 innwhich 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 usednwith the socket. Specifying a protocol of 0 causes socket() to use annunspecified 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 addressnfamily used in the communications domain. The address families supported by thensystem are implementation-dependent.

參數domain指定了在通信域里使用的地址族。此地址族是依賴於所使用的系統實現。

作者註:

比如有的系統不支持IPV6,就算domain參數指定了是IPV6,系統也用不了。

The <sys/socket.h> header defines atnleast 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 socketntype, which determines the semantics of communication over the socket. Thensocket types supported by the system are implementation-dependent. Possiblensocket types include:

參數type指定了套接字的類型,套接字的類型決定了在套接字上進行通信時的通信語義。可能的套接字類型包括:

SOCK_STREAM

Provides sequenced, reliable,nbidirectional, connection-mode byte streams, and may provide a transmissionnmechanism 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 arenconnectionless-mode, unreliable messages of fixed maximum length.

SOCK_DGRAM:此種類型提供了數據報文,這種報文是面向未連接的,不可靠的信息,且是固定的最大長度。

作者註:

比如使用UDP協議就是一種面向未連接的方式,通信雙方傳信時丟了數據也不管,所以傳輸效率上比TCP協議要高一些。

SOCK_SEQPACKET

Provides sequenced, reliable,nbidirectional, connection-mode transmission path for records. A record can bensent using one or more output operations and received using one or more inputnoperations, but a single operation never transfers part of more than onenrecord. 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, itnmust specify a protocol that is supported by the address family. The protocolsnsupported by the system are implementation-dependent.

如果protocol參數是非0的數,那麼一定要為此參數指定一個地址族支持的協議。系統支持的協議是依賴於該系統的。

作者註:

「type」參數與「protocol」參數不是隨便組合的。比如,「type」是SOCK_STREAM時,「protocol」一定得是TCP協議。

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

進程也許需要合適的授權來使用socket()函數,或者進程需要創建一些套接字。

RETURNnVALUE

Upon successful completion, socket()nreturns a nonnegative integer, the socket file descriptor. Otherwise a value ofn-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 thenspecified address family.

實現不支持指定的協議族。

[EMFILE]

No more file descriptors are available fornthis process.

此進程沒有更多可用的文件描述符。

[ENFILE]

No more file descriptors are available fornthe system.

系統沒有更多可用的文件描述符。

[EPROTONOSUPPORT]

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

地址族不支持指定的協議,或者協議不被實現所支持;

[EPROTOTYPE]

The socket type is not supported by thenprotocol.

套接字類型不被協議所支持。

The socket() function may fail if:

socket()函數會由於以下原因可能會失敗:

[EACCES]

The process does not have appropriatenprivileges.

進程沒有相應的許可權。

[ENOBUFS]

Insufficient resources were available innthe system to perform the operation.

系統中沒有足夠的資源來執行操作。

[ENOMEM]

Insufficient memory was available tonfulfill the request.

沒有足夠的內存來滿足要求。

[ENOSR]

There were insufficient STREAMS resourcesnavailable for the operation to complete.

操作要完成,但是沒有足夠的流資源。

APPLICATIONnUSAGE

The documentation for specific addressnfamilies specify which protocols each address family supports. Thendocumentation for specific protocols specify which socket types each protocolnsupports.

具體的地址族的文檔指定了每個地址族支持哪些協議。具體協議的文檔指定了每一個協議支持哪些套接字類型。

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

不知如何翻譯。

作者註:

作者一直在思考該怎麼從形象的角度來理解socket這個概念,想了幾天,遂想出一個比喻,歲不太貼切,但也可幫助理解。

從英文單詞來看,此socket單詞的意思是「插座」,也就是老外拿插座這個日常用品來描述socket編程。我們都知道的,插座提供了幾個插孔為家用電器提供電力,家用電器的電源適配器插在插座上,插座再通過自己的電源線從總電源處獲取電力。那麼用來類別socket編程,就好像將通信的電腦插在一個socket上,電腦通過這個socket來獲取網路上的數據,或者把數據發到網路上。比如我的電腦要跟小張電腦通信,編程時,將一個socket綁在我的電腦上,socket從小張電腦獲取數據,再給到我,就好像插座從總電源獲取電力,再給我的電腦供電。而且,我的電腦還能把數據發給socket,由socket把數據發給小張的電腦,就好像我的電腦把自己的電力給了插座,插座又給了總電源,雖然這個是不可能的啦!

這樣一比喻的話,就比較好理解老外為何在網路編程領域提出socket的概念了。估計老外也是根據插座提供電力這個想到的吧。


推薦閱讀:

WebSocket協議:5分鐘從入門到精通
Socket 和 TCP 有什麼聯繫?建立Socket,操作系統主要是做了哪些事?
TCP 協議下 socket 有可能丟包嗎?

TAG:C编程语言 | CC | Socket |