socket()函数详解!
函數(shù)原型
socket()函數(shù)的原型如下,這個函數(shù)建立一個協(xié)議族為domain、協(xié)議類型為type、協(xié)議編號為protocol的套接字文件描述符。如果函數(shù)調(diào)用成功,會返回一個標(biāo)識這個套接字的文件描述符,失敗的時候返回-1。
#include<sys/types.h>#include<sys/socket.h>int socket(int domain, int type, int protocol);domain
函數(shù)socket()的參數(shù)domain用于設(shè)置網(wǎng)絡(luò)通信的域,函數(shù)socket()根據(jù)這個參數(shù)選擇通信協(xié)議的族。通信協(xié)議族在文件sys/socket.h中定義。
表1 domain的值及含義
| PF_UNIX,PF_LOCAL | 本地通信 | PF_X25 | ITU-T X25 / ISO-8208協(xié)議 |
| AF_INET,PF_INET | IPv4 Internet協(xié)議 | PF_AX25 | Amateur radio AX.25 |
| PF_INET6 | IPv6 Internet協(xié)議 | PF_ATMPVC | 原始ATM PVC訪問 |
| PF_IPX | IPX-Novell協(xié)議 | PF_APPLETALK | Appletalk |
| PF_NETLINK | 內(nèi)核用戶界面設(shè)備 | PF_PACKET | 底層包訪問 |
type
函數(shù)socket()的參數(shù)type用于設(shè)置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數(shù)據(jù)包套接字)等。
表2 type的值及含義
| SOCK_STREAM | Tcp連接,提供序列化的、可靠的、雙向連接的字節(jié)流。支持帶外數(shù)據(jù)傳輸 |
| SOCK_DGRAM | 支持UDP連接(無連接狀態(tài)的消息) |
| SOCK_SEQPACKET | 序列化包,提供一個序列化的、可靠的、雙向的基本連接的數(shù)據(jù)傳輸通道,數(shù)據(jù)長度定常。每次調(diào)用讀系統(tǒng)調(diào)用時數(shù)據(jù)需要將全部數(shù)據(jù)讀出 |
| SOCK_RAW | RAW類型,提供原始網(wǎng)絡(luò)協(xié)議訪問 |
| SOCK_RDM | 提供可靠的數(shù)據(jù)報文,不過可能數(shù)據(jù)會有亂序 |
| SOCK_PACKET | 這是一個專用類型,不能呢過在通用程序中使用 |
并不是所有的協(xié)議族都實(shí)現(xiàn)了這些協(xié)議類型,例如,AF_INET協(xié)議族就沒有實(shí)現(xiàn)SOCK_SEQPACKET協(xié)議類型。
protocol
函數(shù)socket()的第3個參數(shù)protocol用于制定某個協(xié)議的特定類型,即type類型中的某個類型。通常某協(xié)議中只有一種特定類型,這樣protocol參數(shù)僅能設(shè)置為0;但是有些協(xié)議有多種特定的類型,就需要設(shè)置這個參數(shù)來選擇特定的類型。
- 類型為SOCK_STREAM的套接字表示一個雙向的字節(jié)流,與管道類似。流式的套接字在進(jìn)行數(shù)據(jù)收發(fā)之前必須已經(jīng)連接,連接使用connect()函數(shù)進(jìn)行。一旦連接,可以使用read()或者write()函數(shù)進(jìn)行數(shù)據(jù)的傳輸。流式通信方式保證數(shù)據(jù)不會丟失或者重復(fù)接收,當(dāng)數(shù)據(jù)在一段時間內(nèi)任然沒有接受完畢,可以將這個連接人為已經(jīng)死掉。
- SOCK_DGRAM和SOCK_RAW 這個兩種套接字可以使用函數(shù)sendto()來發(fā)送數(shù)據(jù),使用recvfrom()函數(shù)接受數(shù)據(jù),recvfrom()接受來自制定IP地址的發(fā)送方的數(shù)據(jù)。
- SOCK_PACKET是一種專用的數(shù)據(jù)包,它直接從設(shè)備驅(qū)動接受數(shù)據(jù)。
errno
函數(shù)socket()并不總是執(zhí)行成功,有可能會出現(xiàn)錯誤,錯誤的產(chǎn)生有多種原因,可以通過errno獲得:
表3 errno的值及含義
| EACCES | 沒有權(quán)限建立制定的domain的type的socket |
| EAFNOSUPPORT | 不支持所給的地址類型 |
| EINVAL | 不支持此協(xié)議或者協(xié)議不可用 |
| EMFILE | 進(jìn)程文件表溢出 |
| ENFILE | 已經(jīng)達(dá)到系統(tǒng)允許打開的文件數(shù)量,打開文件過多 |
| ENOBUFS/ENOMEM | 內(nèi)存不足。socket只有到資源足夠或者有進(jìn)程釋放內(nèi)存 |
| EPROTONOSUPPORT | 制定的協(xié)議type在domain中不存在 |
| 其他 | ? |
示例
建立一個流式套接字:
int sock = socket(AF_INET, SOCK_STREAM, 0);?
總結(jié)
以上是生活随笔為你收集整理的socket()函数详解!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么socket接收大数据的时候接收不
- 下一篇: ip(IP)地址详解!