欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

socket 函数

再比如

man malloc

socket 函数

从图片中可以看出:

  • 【2】代表system call
  • 【3】代表系统库函数

c/c++ 学习互助qq群:877684253

socket 函数

本人微信:xiaoshitou5854