⑴ linux手冊翻譯——socket(2)
socket - 創建一個用於通信的端點
socket() 創建用於通信的端點並返回引用該端點的文件描述符。 成功調用時返回的文件描述符,將是當前沒有被進程打開的所有文件描述符中編號最低的。
domain 參數指定一個通信域; 以決定用於通信的協議族。 這些系列在 <sys/socket.h> 中定義。 目前 Linux 內核理解的格式包括:
當然最常用的當然是 AF_INET ,即IPV4。
上述地址族的更多詳細信息以及其他幾個地址族的信息可以在 address_families(7) 中找到。
套接字具有指定的 type ,它指定了通信語義。 當前定義的類型有:
某些套接字類型可能不會被所有協議族實現。
從 Linux 2.6.27 開始,type 參數有第二個用途:除了指定套接字類型之外,它還可以包含以下任何值的按位或,以修改 socket() 的行為:
老朋友了,上述兩個,第一個是非阻塞,第二個是執行exec時自動關閉。
protocol 指定要與套接字一起使用的特定協議。 通常只存在一個協議來支持給定協議族中的特定套接字類型 ,在這種情況下,protocol 可以指定為 0。但是,可能存在許多協議,在這種情況下,必須在此指定特定協議方式。 特定協議對應的編號可以查看文件: /etc/protocols
SOCK_STREAM 類型的套接字是全雙工位元組流。 它們不保留記錄邊界。 流套接字必須處於連接狀態,然後才能在其上發送或接收任何數據。 到另一個套接字的連接是通過 connect(2) 調用創建的。 連接後,可以使用 read(2) 和 write(2) 調用或 其變體send(2) 和 recv(2) 的來傳輸數據。 當會話完成時,可以執行 close(2)。 帶外數據也可以按照 send(2) 中的描述進行傳輸,並按照 recv(2) 中的描述進行接收。
實現 SOCK_STREAM 的通信協議確保數據不會丟失或重復。 如果協議的緩沖空間中存在一條數據在合理的時間內不能成功傳輸,則認為該連接已失效。 當 SO_KEEPALIVE 在套接字上啟用時,將會以特定於協議的方式檢查另一端是否仍然存在。 如果進程在損壞的流上發送或接收,則會引發 SIGPIPE 信號; 這會導致不處理信號的進程退出。 SOCK_SEQPACKET 套接字使用與 SOCK_STREAM 套接字相同的系統調用。 唯一的區別是 read(2) 調用將只返回請求的數據量,到達數據包中剩餘的其他數據都將被丟棄。 傳入數據報中的所有消息邊界也被保留。
SOCK_DGRAM 和 SOCK_RAW 套接字允許將數據報發送到在 sendto(2) 調用中指定的通信者。 數據報通常用 recvfrom(2) 接收,它返回下一個數據報及其發送者的地址。
SOCK_PACKET 是一種過時的套接字類型,用於直接從設備驅動程序接收原始數據包。 改用 packet(7)。
An fcntl(2) F_SETOWN operation can be used to specify a process or process group to receive a SIGURG signal when the out-of-band data arrives or SIGPIPE signal when a SOCK_STREAM connection breaks unexpectedly. This operation may also be used to set the process or process group that receives the I/O and asynchronous notification of I/O events via SIGIO. Using F_SETOWN is equivalent to an ioctl(2) call with the FIOSETOWN or SIOCSPGRP argument.
When the network signals an error condition to the protocol mole (e.g., using an ICMP message for IP) the pending error flag is set for the socket. The next operation on this socket will return the error code of the pending error. For some protocols it is possible to enable a per-socket error queue to retrieve detailed information about the error; see IP_RECVERR in ip(7).
套接字的操作由套接字選項控制。 這些選項在 <sys/socket.h> 中定義。 函數setsockopt(2) 和getsockopt(2) 用於設置和獲取選項。對於選項的描述,詳見socket(7).
成功時,將返回新套接字的文件描述符。 出錯時,返回 -1,並設置 errno 以指示錯誤。
POSIX.1-2001, POSIX.1-2008, 4.4BSD.
The SOCK_NONBLOCK and SOCK_CLOEXEC flags are Linux-specific.
socket() appeared in 4.2BSD. It is generally portable to/from non-BSD systems supporting clones of the BSD socket layer (including System V variants).
在 4.x BSD 下用於協議族的清單常量是 PF_UNIX、PF_INET 等,而 AF_UNIX、AF_INET 等用於地址族。 但是,BSD 手冊頁已經承諾:「協議族通常與地址族相同」,隨後的標准到處都使用 AF_*。
⑵ socket通信可不可以Server端設成非阻塞方式,Client端設成阻塞模式
Windows用socket設置非阻塞式 :
unsigned long ul=1;
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul);//設置非阻塞模式
if(ret==SOCKET_ERROR)//設置失敗
{
}
Linux用socket設置非阻塞式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
用socket設置非阻塞式
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
非阻塞設置阻塞用
int flags = fcntl(socket, F_GETFL, 0);
fcntl(socket, F_SETFL, flags & ~O_NONBLOCK);
功能描述:根據文件描述詞操作文件特性
用:
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
參數:
fd:文件描述詞
cmd:操作命令
arg:供命令使用參數
lock:同
操作命令供使用
. F_DUPFD :復制文件描述詞
二. FD_CLOEXEC :設置close-on-exec標志FD_CLOEXEC位0執行execve程文件保持打反則關閉
三. F_GETFD :讀取文件描述詞標志
四. F_SETFD :設置文件描述詞標志
五. F_GETFL :讀取文件狀態標志
六. F_SETFL :設置文件狀態標志
其O_RDONLY O_WRONLY O_RDWR O_CREAT O_EXCL O_NOCTTY O_TRUNC受影響
更改標志 O_APPENDO_ASYNC O_DIRECT O_NOATIME O_NONBLOCK
七. F_GETLK, F_SETLK F_SETLKW :獲取釋放或測試記錄鎖使用參數結構體指針:
F_SETLK:指定位元組范圍獲取鎖(F_RDLCK, F_WRLCK)或者釋放鎖(F_UNLCK)與另進程鎖操作發沖突返 -1並errno設置EACCES或EAGAIN
F_SETLKW:行同F_SETLK除能獲取鎖睡眠等待外等待程接收信號立即返並errno置EINTR
F_GETLK:獲取文件鎖信息
F_UNLCK:釋放文件鎖
設置讀鎖文件必須讀式打設置寫鎖文件必須寫式打設置讀寫鎖文件必須讀寫式打