socket编程学习笔记:部分函数用法以及accept函数问题
学习笔记: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函数问题相关推荐
- socket编程学习笔记
socket编程: 1.网络基础知识 两台计算机通过网络进行通信,首先两台计算机要有唯一的标识,即唯一的IP地址.其次他们要有共同的语言用来交流即协议.再者,每套主机要有相应的端口号. TCP/IP协 ...
- UDP socket 编程学习笔记
UDP编程的基本流程 UDP是无连接.不可靠的数据报协议,不同于TCP的面向连接的可靠数据流.UDP编程常见的应用包括:DNS域名服务器.NFS网络文件系统.SNMP简单网络管理协议. 客户端不必与服 ...
- python的messagebox的用法_Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解...
本文实例讲述了Python GUI编程学习笔记之tkinter中messagebox.filedialog控件用法.分享给大家供大家参考,具体如下: 相关内容: messagebox 介绍 使用 fi ...
- 网络通信编程学习笔记(六):socket编程实战
目录 一.wireshark抓包分析TCP协议 1.1.TCP协议的连接与断开简介 1.2.用wireshark抓取使用TCP协议传输的握手包 二.用Teardrop代码编写一个假包,并抓取 2.1. ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- SHELL编程学习笔记
SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...
- 15Java网络编程学习笔记
Java网络编程学习笔记 文章目录 1 网络基础 1.1 网络通信 1.2 网络 1.3 IP地址 1.5 域名 1.6 端口号 1.7 网络通信协议 1.8 TCP协议 1.9 UDP协议 2 In ...
- Linux与C++11多线程编程(学习笔记)
多线程编程与资源同步 在Windows下,主线程退出后,子线程也会被关闭; 在Linux下,主线程退出后,系统不会关闭子线程,这样就产生了僵尸进程 3.2.1创建线程 Linux 线程的创建 #inc ...
- 2021-11-16派森编程学习笔记“上帝视角下的游戏操盘手” 通过类的继承学会了复用代码,减少代码冗余,提高编程效率。
派森编程学习笔记"上帝视角下的游戏操盘手" [自学笔记] 继承 在Python中继承是指:在类的基础上,它可以实现现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩 ...
最新文章
- Power of Two
- 与guacamole服务器的网络不稳定,Apache Guacamole安全漏洞影响数千万用户 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com...
- emp3r0r - Linux下的进程注入和持久化(初级)
- Nodejs 文件 与 路径 相关用法实例解析
- C# EasyORM
- linux单网卡配置vlan,三线机房Linux服务器单网卡配多VlanIP
- Julia: [1 +j] ==[1 + j] ?
- java遍历map集合传值,Java之五种遍历Map集合的方式
- AI 语音交互开放平台的构建与演进
- 给UI/UX设计师推荐5个国外网站
- 牛客小白月赛1 A题 Etéreo 是个爱学习的好孩子
- 微信支付查询订单V2 接口
- 微信小程序保存图片以及分享给朋友
- 牛小刚的Spring自学笔记之IOC
- 基于HSI颜色模型实现去除照片的“红眼现象”
- 学java被“劝退”的第六天
- 效果炸了,Drawable 实现红鲤鱼动画,点哪儿游哪儿(下)
- 移动硬盘安装Kali所碰到到问题
- 如何实现报表的动态列展现效果
- javascript数组遍历
热门文章
- Vue通过 Babel 显式转译一个node_modules依赖
- Java如何实现的平台无关性的(面试必看)
- Java面试题库,Java大厂高频面试题解析
- html textarea设置只读属性吗,HTML
- ImportError: TensorBoard logging requires TensorBoard with Python summary writer installed. This sho
- 【算法原理】支持向量机SVM算法原理
- 【系列】数据团队价值实现路径02
- 给游戏中的士兵们排一个整齐的队列
- 怎么将考勤的结果用于薪资核算?
- Appium自动化测试实例