服务器开发 Socket 相关函数

news2024/11/26 3:49:55

Socket 函数

#include <sys/types.h> 
#include <sys/socket.h>
int socket(int domain, int type, int protocol)

domain:
AF_INET 这是大多数用来产生 socket 的协议,使用TCP或UDP来传输,用IPv4的地址
AF_INET6 与上面类似,不过是来用IPv6的地址
AF_UNIX 本地协议,使用在Unix和Linux系统上,一般都是当客户端和服务器在同一台及其上的时候使用
type:
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的 socket 类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用 UDP 来进行它的连接。
SOCK_SEQPACKET 该协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW socket 类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、 traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包的顺序
protocol:
传0表示使用默认协议。
返回值:
成功:返回指向新创建的 socket 的文件描述符;失败:返回-1,设置errno

socket()打开一个网络通讯端口,如果成功的话,就像 open() 一样返回一个文件描述符,应用程序可以像读写文件一样用 read/write 在网络上收发数据,如果 socket() 调用出错则返回 -1
对于 IPv4,domain 参数指定为 AF_INET
对于TCP 协议,type参数指定为 SOCK_STREAM,表示面向流的传输协议。
如果是 UDP 协议,则 type 参数指定为 SOCK_DGRAM,表示面向数据报的传输协议。
protocol参数的介绍从略,指定为0即可。

bind 函数

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:socket 文件描述符;
addr:构建出 IP 地址加端口号;
addrlen:sizeof(addr) 长度;
返回值:成功返回 0,失败返回 -1,设置 errno。

服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。

bind()的作用是将参数sockfdaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听addr所描述的地址和端口号。
struct sockaddr * 是一个通用指针类型,addr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度。如:

struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(666);

首先将整个结构体清零,然后设置地址类型为AF_INET, 网络地址为INADDR_ANY, 这个宏表示本地的任意IP地址,因为服务器可能有多个网卡,每个网卡也可能绑定多个 IP 地址, 这样设置可以在所有的IP地址上监听,直到与某个客户端建立了连接时才确定下来到底用哪个IP地址,端口号为666。

listen 函数

#include <sys/types.h>\
#include <sys/socket.h>
int listen(int sockfd, int backlog);

sockfd:socket 文件描述符;
bocklog:在 Linux 系统中,它是指排队等待建立三次握手队列长度。

查看系统默认 backlog

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

在这里插入图片描述
典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accep()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept 的客户端就处于等待状态,listen() 声明 sockfd 处于监听状态,并且最多允许有 backlog 个客户端处于连接状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1

可以改变系统限制的 backlog 大小:

vim /etc/sysctl.conf

最后添加:
net.core.somaxconn = 1024
net.ipv4.tcp_max_syn_backlog = 1024

保存,然后执行:
sysctl -p

accept 函数

#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd:文件描述符
addr:传出参数,返回连接客户端地址信息,含IP地址和端口号
addrlen:传入传出参数(值-结果),传入sizeof(addr)大小,函数返回时返回真正接收到地址结构体的大小。
返回值:成功返回一个新的socket文件描述符,用于和客户端通信,失败返回-1,设置errno

三次握手完成后,服务器调用 accept() 接收连接,如果服务器调用 accept() 时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。addr 是一个传出参数,accpet() 返回时传出客户端的地址和端口号。addrlen 参数是一个传入传出参数(value-result argument),传入的是调用者提供的缓冲区 addr 的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有沾满调用者的缓冲区)。如果给 addr 参数传入 NULL,表示不关心客户端的地址。

while(1){
	cliaddr_len = sizeof(cliaddr);
	connfd = accept(listenfd, (struct sockaddr *)&ccliaddr, &cliaddr_len);
	n = read(connfd, buf, MAXLINE);
	...
	close(connfd);
}

整个是一个while死循环,每次循环处理一个客户端连接。由于 cliaddr_len 是传入传出参数,每次调用 accept() 之前应该重新赋初值。accept() 的参数 listenfd是先前的监听文件描述符,而 accept() 的返回值是另外一个文件描述符 connfd,之后与客户端之间就通过这个connfd 通讯,最后关闭 connfd 断开连接,而不关闭 listenfd,再次回到循环开头 listenfd,仍然用作accept 的参数。accept()成功返回一个文件描述符,出错返回-1

connect 函数

#include "sys/types.h"
#include "sys/socket.h"
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:socket 文件描述符;
addr:传入参数,指定服务器端地址信息,含IP地址和端口号;
返回值:成功返回 0,失败返回 -1, 设置 errno。

客户端需要调用 connect() 连接服务器,connectbind 的参数形式一致,区别在于 bind 的参数是自己的地址,而 connect 的参数是对方的地址。connect 成功返回 0,出错返回 -1

出错处理函数

系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面 可以迅速得到故障信息。

#include <errno.h>
#include <string.h>
char *strerror(int errnum);

errnum:传入参数,错误编号的值,一般取 errno 的值
返回值:错误原因

#include <stdio.h>
#include <errno.h>
void perror(const char *s);

s:传入参数,自定义的描述
返回值:无
向标准出错 stderr 输出错误原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1580233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商选品难?那是因为你不会用大数据选品工具…

电商选品之所以难&#xff0c;主要有以下几个方面的原因。电商市场更新换代非常快&#xff0c;新的产品不断涌现&#xff0c;旧的产品可能很快就被淘汰。电商选品紧跟市场趋势&#xff0c;不断调整和更新&#xff0c;这对电商运营市场敏感度和反应速度提出了很高的要求。 电商…

用友NC importPml SQL注入漏洞(XVE-2023-29120)

0x01 产品简介 用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。这一系列产品基于全球最新的互联网技术、云计算技术和移动应用技术,旨在帮助企业创新管理模式、引领商业变革。 0x02 漏洞概述 用友NC importPml接口存在SQL注入漏洞,攻击者通过利…

java操作linux

文章目录 远程连接服务器执行linux命令或shell脚本介绍Process的方法相关类UML 工具类基本工具类依赖第三方的工具类 远程连接服务器 java程序远程linux服务器有两个框架分别是&#xff1a;jsch与ganymed-ssh2框架。推荐使用jsch框架&#xff0c;因为ganymed-ssh2框架不支持麒…

诚邀莅临!道合顺将携“气体传感器”亮相深圳国际传感器与应用技术展览会

2024年4月14日-16日&#xff0c;深圳国际传感器与应用技术展览会将在深圳会展中心&#xff08;福田&#xff09;盛大举办。道合顺传感将携旗下系列专业气体传感器产品亮相展会&#xff0c;更有重磅新品传感器方案现场展示&#xff0c;真诚期待您的到来&#xff01; 传感器技术、…

球球大作战Python单机版本

球球大作战是一个多人在线游戏&#xff0c;玩家需要控制一个小球&#xff0c;通过吞食地图上的小点来增加自己的体积&#xff0c;同时避免被其他更大的球体吞噬。下面是一个简化版的球球大作战游戏&#xff0c;使用Python语言和pygame库来实现。在这个简化版中&#xff0c;我们…

pycharm环境配置踩坑

一、新建目录 venv 二、创建本地解释器 3、配置国内镜像 1&#xff09;镜像源 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大…

宠物医院管理系统

文章目录 宠物医院管理系统一、系统演示二、项目介绍三、12000字论文参考四、系统部分页面展示五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 宠物医院管理系统 一、系统演示 宠物医院管理系统 二、项目介绍 语言&#xf…

HarmonyOS实战开发-使用OpenGL实现2D图形绘制和动画。

介绍 基于XComponent组件调用Native API来创建EGL/GLES环境&#xff0c;从而使用标准OpenGL ES进行图形渲染。本项目实现了两个示例&#xff1a; 使用OpenGL实现2D的图形绘制和动画&#xff1b;使用OpenGL实现了在主页面绘制两个立方体&#xff0c;光源可以在当前场景中移动&…

MySQL客户端安装并配置免密登录

最近在写脚本时需要向MySQL数据库中存储数据&#xff0c;且脚本运行的服务器与MySQL服务器不是同一台服务器&#xff0c;而且需要保证MySQL密码的安全性&#xff0c;不能在脚本中暴露&#xff0c;所以就需要在服务器上安装MySQL客户端&#xff0c;并配置免密登录。 一、虚拟机…

使用注意力机制的 LSTM 彻底改变时间序列预测

目录 一、说明二、LSTM 和注意力机制简介三、为什么要将 LSTM 与时间序列注意力相结合&#xff1f;四、模型架构训练与评估 五、验证六、计算指标七、结论 一、说明 在时间序列预测领域&#xff0c;对更准确、更高效的模型的追求始终存在。深度学习的应用为该领域的重大进步铺…

【golang】动态生成微信小程序二维码实战下:golang 生成 小程序二维码图片 并通过s3协议上传到对象存储桶 | 腾讯云 cos

项目背景 在自研的系统&#xff0c;需要实现类似草料二维码的功能 将我们自己的小程序&#xff0c;通过代码生成相想要的小程序二维码 代码已经上传到 Github 需要的朋友可以自取 https://github.com/ctra-wang/wechat-mini-qrcode 一、生成Qrcode并提交到对象存储 通过源生A…

中颖51芯片学习4. 可编程计数器阵列PCA0

中颖51芯片学习4. 可编程计数器阵列PCA0 一、PCA介绍1. PCA简介2. SH79F9476的PCA0特性3. PCA0 功能4. 时钟5. PCA0原理框图6. 工作方式 二、PCA0寄存器1. PCA0标志寄存器2. PCA使能寄存器3. PCA0方式寄存器4. P0CPMn PCA捕捉/比较寄存器5. P0FORCE强制输出控制寄存器6. PCA0计…

《极域多媒体教室互动管理系统软件》控制方法大全

前言及背景&#xff1a; 当我坐在电脑前&#xff0c;打开它&#xff0c;点开谷歌&#xff0c;刚刚想打开百度&#xff0c;突然闪出来了&#xff1a; 该网页已被阻止&#xff01;&#xff01;&#xff01; 正文&#xff1a; 1.极域控制原理&#xff1a; 好…

使用EZDML自动生成测试数据

项目场景: 项目开发时,新创建的表需要增加一部分测试数据用于简单的功能测试。 问题描述 无论使用代码还是使用plsql自带的数据生成工具都感觉有点麻烦,我只想点点点就能生成数据。 解决方案: 提示:这里填写该问题的具体解决方案: 使用 EZDML 可以方便的生成测试数据。…

吴恩达深度学习 (week1,2)

文章目录 1、神经网络监督学习2、深度学习兴起原因3、深度学习二元分类4、深度学习Logistic 回归5、Logistic 回归损失函数6、深度学习梯度下降法7、深度学习向量法8、Python 中的广播9、上述学习总结10、大作业实现:rocket::rocket:&#xff08;1&#xff09;训练初始数据&…

如何开始用 C++ 写一个光栅化渲染器?

光栅化渲染器是计算机图形学中最基础且广泛应用的一种渲染技术&#xff0c;它将三维模型转化为二维图像。下面我们将逐步介绍如何使用C语言从零开始构建一个简单的光栅化渲染器。 一、理解光栅化渲染原理 光栅化是一种将几何数据&#xff08;如点、线、三角形&#xff09;转换…

一文详解手机IP地址如何改变

在互联网时代&#xff0c;手机的IP地址扮演着至关重要的角色。它不仅是手机在网络中的标识&#xff0c;还关系到手机的网络连接、隐私保护以及访问权限等方面。然而&#xff0c;在某些情况下&#xff0c;我们可能需要改变手机的IP地址&#xff0c;以满足特定的需求或解决网络问…

8×8点阵数码管显示驱动/大电流数码管驱动IC-VK16K33C SOP20

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK16K33C 封装形式&#xff1a;SOP20 概述 VK16K33C是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片&#xff0c;内部集成有数据锁 存器、键盘扫描、LED 驱动模块等电路。数据通过I2C通讯接口与MCU通信。SE…

腾讯再次回归电商,视频号小店真的要起飞了?

大家好&#xff0c;我是电商小布。 在互联网快速发展的现状下&#xff0c;各个平台都开始加入到电商这一行。 就连之前在电商上栽过跟头的腾讯&#xff0c;都再次回归电商&#xff0c;推出了视频号小店这个项目。 视频号小店背靠着视频号平台&#xff0c;结合当前最热的电商…

数字中国_智慧公厕

在面向未来构建城市竞争新优势、推动城市治理现代化的进程中&#xff0c;推进城市智慧化发展、数字化转型显得尤为重要。作为一种新形态的信息化公共厕所&#xff0c;智慧公厕扮演着举足轻重的角色&#xff0c;对于智慧城市和智慧乡村的发展至关重要&#xff0c;也是城市信息化…