Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1446410
  • 博文数量: 263
  • 博客积分: 10851
  • 博客等级: 上将
  • 技术积分: 2627
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-26 22:40
文章分类

全部博文(263)

文章存档

2013年(4)

2012年(25)

2011年(33)

2010年(50)

2009年(138)

2008年(13)

分类: LINUX

2010-09-22 15:10:21

socket函数是任何套接口网络编程中第一个使用的函数,它向用户提供一个套接字,即套接口描述文件字,它是一个整数,如同文件描述符一样,是内核标识一个IO结构的索引。通过socket函数,我们指定一个套接口的协议相关的属性,为进行使用socket api做好准备。

如同所有的介绍API的文档一样,我们先给出socket函数的原型:

#include
int socket(int family, int type, int protocol)
返回:非负描述字──成功, -1──出错

参数family 
这个参数指定一个协议簇,也往往被称为协议域。系统存在许多可以的协议簇,常见有AF_INET──指定为IPv4协议,AF_INET6──指定为IPv6,AF_LOCAL──指定为UNIX 协议域等等。它值都是系统预先定义的宏,系统支持哪些协议我们才可以使用,否则会调用失败。协议簇是网络层的协议。 
可以到内核源码linux/socket.h中查看支持的协议簇有哪些。 另外有#define PF_* AF_*

参数type 
这个参数指定一个套接口的类型,套接口可能的类型有:SOCK_STREAM、SOCK_DGRAM、SOCK_SEQPACKET、SOCK_RAW等等,它们分别表明字节流、数据报、有序分组、原始套接口。这实际上是指定内核为我们提供的服务抽象,比如我们要一个字节流。需要注意的,并不是每一种协议簇都支持这里的所有的类型,所以类型与协议簇要匹配。 

参数protocol 
指定相应的传输协议,也就是诸如TCP或UDP协议等等,系统针对每一个协议簇与类型提供了一个默认的协议,我们通过把protocol设置为0来使用这个默认的值。注意这里的协议与上面的协议簇是两个不同的概念,前者是指网络层的协议,由于它对于到传输层会出现许多协议,比如IPv4可以用来实现TCP或UDP等等传输层协议,所以称为协议簇。相应的传输层的协议就简单地称为协议。常见的协议有TCP、UDP、SCTP,要指定它们分别使用宏IPPROTO_TCP、IPPROTO_UPD、IPPROTO_SCTP来指定。 
到linux/in.h看可以使用哪些传输层的协议

返回值 
socket函数返回一个套接字,即套接口描述字。如果出现错误,它返回-1,并设置errno为相应的值,用户应该检测以判断出现什么错误。 

下面给出几个使用socket函数的示例:

#include
//使用IPv4作为协议簇,使用字节流类型,
//使用系统针对IPv4与字节流的默认的协议,一般为TCP
int sockfd=socket(AF_INET, SOCK_STRAM, 0);

//使用STCP作为协议
int sockfd=socket(AF_INET, SOCK_STRAM, IPPROTO_SCTP);

//使用数据报
int sockfd=socket(AF_INET, SOCK_DGRAM, 0);
阅读(16802) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~