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
本人微信:xiaoshitou5854
原文链接: https://www.cnblogs.com/xiaoshiwang/p/9747474.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/282591
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!