日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

socket()函数详解!

發(fā)布時間:2025/6/15 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket()函数详解! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(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_X25ITU-T X25 / ISO-8208協(xié)議
AF_INET,PF_INETIPv4 Internet協(xié)議PF_AX25Amateur radio AX.25
PF_INET6IPv6 Internet協(xié)議PF_ATMPVC原始ATM PVC訪問
PF_IPXIPX-Novell協(xié)議PF_APPLETALKAppletalk
PF_NETLINK內(nèi)核用戶界面設(shè)備PF_PACKET底層包訪問

type

函數(shù)socket()的參數(shù)type用于設(shè)置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數(shù)據(jù)包套接字)等。

表2 type的值及含義

名稱含義
SOCK_STREAMTcp連接,提供序列化的、可靠的、雙向連接的字節(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_RAWRAW類型,提供原始網(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。