socket 函数
程序员文章站
2022-03-25 22:55:58
socket 函数 system Call socket 函数原型: 参数adressfamily 举例 | adress family种类 | 功能描述 | | | | | AF_INET | IPV4用socket | | AF_INET6 | IPV6用socket | | AF_UNIX | ......
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】代表系统库函数