int socket(int,int,int)详解

在socket通信中,会用int socket(int,int,int)新实例初始化 Socket 类使用指定的地址族、 套接字类型和协议。
但真的了解他的使用方式了么?

socket(AddressFamily, SocketType, ProtocolType)

上面的socket初始化如果成功将会返回过来一个int类型的正整数,否则就会返回一个-1

下面是来看一下函数中是如何定义这个socket的各个参数的类型的

public:
Socket(
    AddressFamily addressFamily,
    SocketType socketType,
    ProtocolType protocolType
)

使用socket这个函数

socket(AddressFamily,SocketType,ProtocolType)

第一位AddressFamily地址族

Linux#include <sys/socket.h>中,宏定义了40个类型

/*
* Address families.
*/
#define AF_UNSPEC 0 /* unspecified */
#define AF_UNIX 1 /* local to host (pipes) */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define AF_LOCAL AF_UNIX /* backward compatibility */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define AF_IMPLINK 3 /* arpanet imp addresses */
#define AF_PUP 4 /* pup protocols: e.g. BSP */
#define AF_CHAOS 5 /* mit CHAOS protocols */
#define AF_NS 6 /* XEROX NS protocols */
#define AF_ISO 7 /* ISO protocols */
#define AF_OSI AF_ISO
#define AF_ECMA 8 /* European computer manufacturers */
#define AF_DATAKIT 9 /* datakit protocols */
#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
#define AF_SNA 11 /* IBM SNA */
#define AF_DECnet 12 /* DECnet */
#define AF_DLI 13 /* DEC Direct data link interface */
#define AF_LAT 14 /* LAT */
#define AF_HYLINK 15 /* NSC Hyperchannel */
#define AF_APPLETALK 16 /* Apple Talk */
#define AF_ROUTE 17 /* Internal Routing Protocol */
#define AF_LINK 18 /* Link layer interface */
#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
#define AF_COIP 20 /* connection-oriented IP, aka ST II */
#define AF_CNT 21 /* Computer Network Technology */
#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
#define AF_IPX 23 /* Novell Internet Protocol */
#define AF_SIP 24 /* Simple Internet Protocol */
#define pseudo_AF_PIP 25 /* Help Identify PIP packets */
#define AF_NDRV 27 /* Network Driver 'raw' access */
#define AF_ISDN 28 /* Integrated Services Digital Network */
#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
#define pseudo_AF_KEY 29 /* Internal key-management function */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#define AF_INET6 30 /* IPv6 */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define AF_NATM 31 /* native ATM access */
#define AF_SYSTEM 32 /* Kernel event messages */
#define AF_NETBIOS 33 /* NetBIOS */
#define AF_PPP 34 /* PPP communication protocol */
#define pseudo_AF_HDRCMPLT 35 /* Used by BPF to not rewrite headers
in interface output routine */
#define AF_RESERVED_36 36 /* Reserved for internal usage */
#define AF_IEEE80211 37 /* IEEE 802.11 protocol */
#define AF_UTUN 38
#define AF_MAX 40
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */

一般常用AF_UNIXAF_INET
AF_UNIX这个类型的地址族用于单台服务器通信,常用语嵌入式类型的通信
AF_INET这个比较通用

AF = Address Family
PF = Protocol Family

Windows下,AF_INET = PF_INET可以完全等同使用,
而在Unix/Linux系统中,在不同的版本中这两者有微小差别.对于BSDAF,对于POSIXPF.

第二位SocketType,是套接字类型

关于套接字类型,有下面5种类型的宏定义

/*
* Types
*/
#define SOCK_STREAM 1 /* stream socket */
#define SOCK_DGRAM 2 /* datagram socket */
#define SOCK_RAW 3 /* raw-protocol interface */
#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
#define SOCK_RDM 4 /* reliably-delivered message */
#endif /* (!_POSIX_C_SOURCE || _DARWIN_C_SOURCE) */
#define SOCK_SEQPACKET 5 /* sequenced packet stream */

第三位ProtocolType,是协议类型

Mac下,类似于Linux,有这么一段话Protocol families, same as address families for now.。现在,协议族跟地址族相似
所以,可以跟地址族混用。
默认使用0,未定义协议类型。

上面说明清楚了,就可以来初始化一个套接字实例了。

socket(AF_INET,SOCK_STREAM,0);

上面就是是实例化一个套接字,用网络类型的地址族,像:TCP,UDP等,都在传输层;
使用了套接字流的类型(类型还有数据报套接字
然后就选择未定义类型的协议
如果初始化成功,就会返回一个 int 类型的非负整数,否则就返回一个-1
用于判断是否初始化成功的代码

if ((sockfd = socket(AF_INET , SOCK_STREAM, 0)) == -1)
{
    perror("socket" );
    return -1;
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注