int socket(int,int,int)详解

原创 2017年01月03日 11:28:29

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

if ((sockfd = socket(AF_INET , SOCK_STREAM, 0)) == -1) 
{
    perror("socket" );
    return -1;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

socket编程总结(六) / int socket(int domain, int type, int protocol)

int socket(int domain, int type, int protocol)   函数返回一个整型的socket描述符,供后面的使用,其中参数:   domain:指明使用的协议族...
  • u011146511
  • u011146511
  • 2016年07月12日 13:44
  • 1541

int socket(int domain, int type, int protocol)参数详解

前言: 网上对于socket的资料很多,但是很凌乱。笔者这里整理一下socket的各种参数。 可参考本人博客: Linux下的raw Socket(原始套接字)编程:http://blog.cs...
  • luchengtao11
  • luchengtao11
  • 2017年07月07日 14:38
  • 263

int socket( int family, int type, int,protocol)

[net/socket.c] SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval; struc...
  • u014211079
  • u014211079
  • 2015年04月16日 16:20
  • 575

int (*func(int)) (int *,int)

转自:http://www.iteye.com/problems/24480 #include #define NULL 0 #define ASGN 1 #define MU...
  • tmkeepgood
  • tmkeepgood
  • 2017年04月14日 10:38
  • 162

怎么用socket传送int类型的信息(java)?

可以用 DataOutputStream 和 DataInputStream  // 接收端 final ServerSocket server = new ServerSocket(909...
  • qw3670
  • qw3670
  • 2017年06月13日 09:45
  • 405

socket(int family, int type, int protocol)各参数解释

family: /* Supported address families. */ #define AF_UNSPEC 0 #define AF_UNIX 1 /* Unix domain socke...
  • Oliverlyn
  • Oliverlyn
  • 2017年01月09日 09:28
  • 810

Int (*(*F)(int,int))(int)

(1). float(**def)[10];  def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float(2). double*(*gh)[10];  gh是一个指针,它指向一个一...
  • toplin8
  • toplin8
  • 2006年03月23日 09:32
  • 1001

C语言SOCKET发送int数据转char数据

#include #include int main() { int count = 4123131; char countBuff[1]; memset( countBuff, 0, 1 );...
  • panshiqu
  • panshiqu
  • 2013年04月11日 09:25
  • 1117

int (*a)(int) ; int (*a[10])(int); int *(*a)(int) ;

int* (*a)[10]; a是一个指向包含10个int型指针元素的数组。 比如: #include int main() {     //定义数组,包含10个int*   ...
  • HouQi02
  • HouQi02
  • 2016年05月23日 10:45
  • 697

int socket (int domain, int type, int protocol);

int socket (int domain, int type, int protocol); 1 参数protocol用来指明所要接收的协议包,如果是象IPPROTO_TCP(6)这种非0、非2...
  • hsf_study
  • hsf_study
  • 2016年06月22日 14:29
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:int socket(int,int,int)详解
举报原因:
原因补充:

(最多只允许输入30个字)