经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
socket 函数
来源:cnblogs  作者:小石王  时间:2018/10/8 9:14:40  对本文有异议

socket 函数

system Call socket 函数原型:

  1. 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下的查看方法:

  1. sudo cat /etc/protocols

socket的本质是linux系统里的文件描述符(file descriptor),就是一个整数值。

linux里标准的文件描述符:

整数值 名字 说明
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误输出

所以判断socket建立成功与否,就是判断system call socket的返回值是啥

  1. int sock = socket(AF_INET, SOCK_STREAM, 0);
  2. if(sock < 0){
  3. cout << "socket 建立失败" << endl;
  4. return -1;
  5. }

注意:不可以用if(sock <= 0)来判断,=0的时候,也有可能是socket建立成功。下面代码socket建立成功了,但是返回值是0.因为提前把stdin关闭了。

  1. int main(){
  2. int sock;
  3. cout << "fileno(stdin): " << fileno(stdin) << endl;
  4. close(0);
  5. sock = socket(AF_INET, SOCK_DGRAM, 0);
  6. cout << sock << endl;
  7. }

当使用一个函数时,但不知道是在哪个.h文件的时候,输入:

  1. man 函数名字

会得到类似下面的结果,比如

  1. man socket

再比如

  1. man malloc

从图片中可以看出:

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

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

本人微信:xiaoshitou5854

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号