学习笔记:socket编程部分函数用法

  • socket()函数:
  • bind()函数:
  • listen()函数:
  • accept()函数:
  • connect()函数:

socket()函数:

socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个sockfd套接字,它唯一标识一个socket。创建socket的时候,也可以指定不同的参数创建不同的socket套接字;

domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET(ipv4地址)、AF_INET6(ipv6地址)、AF_LOCAL、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址;

type:指定socket类型。常用的socket类型有,SOCK_STREAM(TCP协议)、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET等等;

protocol:指定协议。常用的协议有,IPPROTO_TCP(TCP传输协议)、IPPTOTO_UDP(UDP传输协议),IPPROTO_SCTP(STCP传输协议)
等等,type和protocol并不是可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默
认协议;

bind()函数:

bind是捆绑的意思,通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器,个人理解,bind函数就是将ip地址和端口号绑定在创建的socket套接字里;
sockfd:即socket套接字,它是通过socket()函数创建的,仅仅标识唯一的一个socket;

addr:一个const struct sockaddr *类型的指针,指向绑定给sockfd的协议地址。创建socket时的地址协议族不同,导致地址不同,但可以通过强制转换后赋值给sockaddr这种类型的指针((struct sockaddr *)&server_addr;);

addrlen:对应的是sockaddr结构体的大小,即addr里面绑定服务器端地址等信息的结构体的长度,一般为sizeof(sockaddr);

listen()函数:

socket()函数创建的socket套接字默认是一个主动类型的,在服务端,创建socket,bind后需要调用listen函数监听是否有客户端连接,该函数将socket套接字变为被动类型的,等待客户的连接;

sockfd: 即socket套接字,socket()系统调用创建的要监听的描述字;

backlog: 相应socket可以在内核里排队的最大连接个数;

accept()函数:

服务端调用socket()、bind()、listen()函数之后,就会监听指定的socket地址,服务器之后就会调用accpet()接受来自客户端的连接请求,这个函数默认是一个阻塞函数,如果没有客户端连接服务器该程序将一直停滞,直到有一个客户端调用connect()函数就会触发服务器的accept()返回,这时整个服务器客户端链接就建立完成;

sockfd: 即socket套接字,socket()系统调用创建的要监听的套接字;

注:accept函数在接受一个客户端连接请求后会返回一个新的sockfd,此sockfd和socket、bind调用时返回的sockfd并不是一个,此sockfd用于服务端和客户端之间的通信,不同的客户端之间的sockfd也不同;

addr::一个const struct sockaddr *类型的指针,用于返回客户端的协议地址,这个地址里包含有客户端的IP和端口信息等,和bind函数里第二个参数使用方法一样;

addrlen: 这个参数是一个传入传出参数,传入addrlen值的大小,当有客户端请求连接时,函数会根据addrlen的值大小往 sockaddr结构体里填入数据,值的大小会影响填入数据是否正确,(需要定义socklen_t addrlen;相当于unsigned int类型),可以使其等于sockaddr结构体的大小,addrlen=sizeof( sockaddr),也就是对其进行初始化;函数返回时返回包含对等地址的实际数值(一般为服务器地址),所以每次和客户端建立连接accept函数返回后最好都对其进行初始化,因为要改变值,所以为指针类型,传入地址;

如果不初始化addrlen,在客户端连接服务器时由于addrlen是随机值,sockaddr结构体里的数据填入不正确,服务器端可能会出现以下问题:

connect()函数:

客户端调用socket()创建sockfd之后,如果客户端调用connect()发出连接请求,服务端就会接收到这个请求并使accept()返回,accept()返回的新的sockfd就是对应到该客户的连接,通过这两个sockfd(客户端connect的sockfd和服务器端accept返回的sockfdfd)就可以实现客户端和服务器端的相互通信。

sockfd: 即socket套接字,客户端调用socket()创建套接字;

addr: 要连接的服务器的信息,包含服务器的IP地址和端口等信息,保存在相应的结构体里;

addrlen: 对应的是sockaddr结构体的大小,即addr里面绑定服务器端地址等信息的结构体的长度,一般为sizeof(sockaddr);

socket编程学习笔记:部分函数用法以及accept函数问题相关推荐

  1. socket编程学习笔记

    socket编程: 1.网络基础知识 两台计算机通过网络进行通信,首先两台计算机要有唯一的标识,即唯一的IP地址.其次他们要有共同的语言用来交流即协议.再者,每套主机要有相应的端口号. TCP/IP协 ...

  2. UDP socket 编程学习笔记

    UDP编程的基本流程 UDP是无连接.不可靠的数据报协议,不同于TCP的面向连接的可靠数据流.UDP编程常见的应用包括:DNS域名服务器.NFS网络文件系统.SNMP简单网络管理协议. 客户端不必与服 ...

  3. python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...

    本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...

  4. 网络通信编程学习笔记(六):socket编程实战

    目录 一.wireshark抓包分析TCP协议 1.1.TCP协议的连接与断开简介 1.2.用wireshark抓取使用TCP协议传输的握手包 二.用Teardrop代码编写一个假包,并抓取 2.1. ...

  5. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  6. SHELL编程学习笔记

    SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...

  7. 15Java网络编程学习笔记

    Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...

  8. Linux与C++11多线程编程(学习笔记)

    多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...

  9. 2021-11-16派森编程学习笔记“上帝视角下的游戏操盘手” 通过类的继承学会了复用代码,减少代码冗余,提高编程效率。

    派森编程学习笔记"上帝视角下的游戏操盘手" [自学笔记] 继承 在Python中继承是指:在类的基础上,它可以实现现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩 ...

最新文章

  1. Power of Two
  2. 与guacamole服务器的网络不稳定,Apache Guacamole安全漏洞影响数千万用户 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com...
  3. emp3r0r - Linux下的进程注入和持久化(初级)
  4. Nodejs 文件 与 路径 相关用法实例解析
  5. C# EasyORM
  6. linux单网卡配置vlan,三线机房Linux服务器单网卡配多VlanIP
  7. Julia: [1 +j] ==[1 + j] ?
  8. java遍历map集合传值,Java之五种遍历Map集合的方式
  9. AI 语音交互开放平台的构建与演进
  10. 给UI/UX设计师推荐5个国外网站
  11. 牛客小白月赛1 A题 Etéreo 是个爱学习的好孩子
  12. 微信支付查询订单V2 接口
  13. 微信小程序保存图片以及分享给朋友
  14. 牛小刚的Spring自学笔记之IOC
  15. 基于HSI颜色模型实现去除照片的“红眼现象”
  16. 学java被“劝退”的第六天
  17. 效果炸了,Drawable 实现红鲤鱼动画,点哪儿游哪儿(下)
  18. 移动硬盘安装Kali所碰到到问题
  19. 如何实现报表的动态列展现效果
  20. javascript数组遍历

热门文章

  1. Vue通过 Babel 显式转译一个node_modules依赖
  2. Java如何实现的平台无关性的(面试必看)
  3. Java面试题库,Java大厂高频面试题解析
  4. html textarea设置只读属性吗,HTML
  5. ImportError: TensorBoard logging requires TensorBoard with Python summary writer installed. This sho
  6. 【算法原理】支持向量机SVM算法原理
  7. 【系列】数据团队价值实现路径02
  8. 给游戏中的士兵们排一个整齐的队列
  9. 怎么将考勤的结果用于薪资核算?
  10. Appium自动化测试实例