socket 函数
socket 函数
system Call socket 函数原型:
int socket(int addressfamily, int type, int protocol);
参数adressfamily 举例
| adress family种类 | 功能描述 |
|---|---|
| AF_INET | IPV4用socket |
| AF_INET6 | IPV6用socket |
| AF_UNIX | 本地进程间通信用socket,也叫AF_LOCAL |
| AF_PACKET | driver lebel socket的接口 |
参数type 举例
| type 种类 | 功能描述 |
|---|---|
| SOCK_STREAM | 保证有序,都能到达。双向的byte stream |
| SOCK_DGRAM | 不保证连接,顺序,支持data的最大固定长度 |
adressfamily和type的组合,来决定是使用TCP还是UDP协议
- AF_INET+SOCK_STREAM : IPv4+TCP
- AF_INET6+SOCK_STREAM : IPv6+TCP
- AF_INET+SOCK_DGRAM : IPv4+UDP
- AF_INET6+SOCK_DGRAM : IPv6+UDP
SOCK_STREAM和SOCK_DGRAM的比较:
| socket种类 | 数据是否一定送达 | 数据到达顺序 | 一次送信的数据量的大小 |
|---|---|---|---|
| SOCK_STREAM | 一定 | 按发送顺序 | 没有大小限制 |
| SOCK_DGRAM | 不一定 | 有可能不是发送顺序 | 有大小限制 |
参数protocol 在ubuntu下的查看方法:
sudo cat /etc/protocols
socket的本质是linux系统里的文件描述符(file descriptor),就是一个整数值。
linux里标准的文件描述符:
| 整数值 | 名字 | 说明 |
|---|---|---|
| 0 | stdin | 标准输入 |
| 1 | stdout | 标准输出 |
| 2 | stderr | 标准错误输出 |
所以判断socket建立成功与否,就是判断system call socket的返回值是啥
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0){
cout << "socket 建立失败" << endl;
return -1;
}
注意:不可以用if(sock <= 0)来判断,=0的时候,也有可能是socket建立成功。下面代码socket建立成功了,但是返回值是0.因为提前把stdin关闭了。
int main(){
int sock;
cout << "fileno(stdin): " << fileno(stdin) << endl;
close(0);
sock = socket(AF_INET, SOCK_DGRAM, 0);
cout << sock << endl;
}
当使用一个函数时,但不知道是在哪个.h文件的时候,输入:
man 函数名字
会得到类似下面的结果,比如
man socket

再比如
man malloc

从图片中可以看出:
- 【2】代表system call
- 【3】代表系统库函数
c/c++ 学习互助QQ群:877684253


浙公网安备 33010602011771号