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

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/9747474.html