socket 函数
system Call socket 函数原型:
int socket(int addressfamily, int type, int protocol);
参数adressfamily 举例
AF_INET |
IPV4用socket |
AF_INET6 |
IPV6用socket |
AF_UNIX |
本地进程间通信用socket,也叫AF_LOCAL |
AF_PACKET |
driver lebel socket的接口 |
参数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的比较:
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
![](https://img2018.cnblogs.com/blog/1414315/201810/1414315-20181006152933481-437699277.png)
再比如
man malloc
![](https://img2018.cnblogs.com/blog/1414315/201810/1414315-20181006152946502-600376359.png)
从图片中可以看出:
- 【2】代表system call
- 【3】代表系统库函数
c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201810/1414315-20181006153027996-887411155.jpg)
本人微信:xiaoshitou5854