int socket(int,int,int)详解

来源:互联网 发布:d3.js v3api 编辑:程序博客网 时间:2024/04/29 04:55

在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 FamilyPF = 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等,都在传输层;
使用了套接字流的类型(类型还有数据报套接字<DatagramSocket>
然后就选择未定义类型的协议
如果初始化成功,就会返回一个 int 类型的非负整数,否则就返回一个-1
用于判断是否初始化成功的代码

if ((sockfd = socket(AF_INET , SOCK_STREAM, 0)) == -1) {    perror("socket" );    return -1;}
0 0
原创粉丝点击