网络编程知识点总结(3)

news2024/12/27 5:12:12

socket 服务器的开发步骤和代码实现

1.创建套接字

socket()函数

int socket(int domain, int type, int protocol);

domain:
指明所使用的协议族,通常为 AF_INET,表示互联网协议族(TCP/IP 协议族)
AF_INET IPv4因特网域.
AF_INET6 IPv6 因特网域
AF_UNIX Unix 域
AF_ROUTE 路由套接字
AF_KEY 密钥套接字
AF_UNSPEC 未指定

type参数指定 socket 的类型
SOCK_STREAM:
流式套接字提供可靠的、面向连接的通信流,它使用 TCP 协议,从而保证了数据传输的正确性和顺序性
SOCK_DGRAM:
数据报套接字定义了一种无连接的服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。它使用教据报协议UDP
SOCK_RAW:                                                                                                                                    允许程序使用低层协议,原始套接字允许对底层协议如 IP 或 ICMP 进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发

protocol:
通常赋值"0"
0选择type类型对应的默认协议
IPPROTO_TCP TCP 传输协议
IPPROTO_UDP UDP 传输协议
IPPROTO_SCTP SCTP 传输协议
IPPROTO_TIPC TIPC 传输协议

2.为套接字添加信息 (IP地址和端口号)

bind()函数: IP号端口号与相应描述字赋值函数

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


功能
用于绑定 IP 地址和端口号到 socketfd
参数
sockfd
是一个 socket 描述符
addr
是一个指向包含有本机 IP 地址及端口号等信息的 sockaddr 类型的指指向要绑定给 sockfd 的协议地址结构,这个地址结构根据地址创建 socket 时的地址协议族的不同而不同

struct sockaddr{
    unisgned short as_family;    //协议族                                              
    char sa_data[14];            //IP+端口
};

同等替换

struct sockaddr_in {
    sa_family_t sin_family; //协议族
    in_port_t sin_port;  //端口号
    struct in_addr sin_addr;  //IP地址结构体
    unsigned char sin_zero[8];  //没有实际意义只是为跟sockaddr结构在内存中对亮这样两者才能相互转换
};

地址转换API

int inetaton(const char* straddrstruct in_addr *addrp);                                                                      把字符串形式的“10.100.13.165”转为网络能识别的格式(用命令ifconfig查看自己的inet addr)

char* inetntoa(struct in_addr inaddr);                                                                                               把网络格式的ip地址转为字符串形式

3.监听网络连接

listen()函数:监听设置函数

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

功能
设置处理的最大连接数,listen()并未开始接受连线,只是设置 sockect listen 模式,listen 函数只用于服务器端,服务器进程不知道要与谁连接,因此,它不会主动此要求与某个进程连接,只是一直监听是否有其他客户进程与之连接,然后响应该连接清求,并对它做出处理,一个服务进程可以同时处理多个客户进程的连接。主要就两个功能:将一个未连接的套接字转换为一个被动套接字(监听),规定内核为相应套接字排队的最大连接数。
内核为任何一个给定监听套接字维护两个队列:
(1) 未完成连接队列,每个这样的 SYN 报文段对应其中一项:已由某个客户端发出并到达服务器,而服务正在等待完成相应的 TCP 三次握手过程。这些套接字处于SYN_REVD 状态
(2) 已完成连接队列,每个已完成 TCP 三次握手过程的客户端对应其中一项。这些套接字处于 ESTABLISHED 状态

参数
sockfd
sockfd socket 系统调用返回的服务器端 socket 描述符
backlog
backlog 指定在请求队列中允许的最大请求数

4.监听到有客户端接入,接受一个连接

accept()函数

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

功能
accept 函数由 TCP 服务器调用,用于从已完成连接队列队头回下一个已完成连接。如果已完成连接队列为空,那么进程被投入睡眠。

参数
sockfd
sockfdsocket 系统调用返回的服务器端 socket 描述符
addr
用来返回已连接的对端(客户端)的协议地址
addrled
客户端地址长度
返回值
该函数的返回值是一个新的套接字描术符,返回值是表示已连接的套接字描述待,而第一个参教是服务跟监听套接字描术待。一个服务器通常仅仅创建一个监听套接字,它在该服务器的生命周期内一直存在。内核为每个由服务进程接受的客户连接创建一个已连接套接字(表示 TCP 三次握手已完成),当服务器完成对某个给定客户的服务时,相应的已连接套接字就会被关闭。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>

int main()
{
        int s_fd;

        //1.socket
        s_fd = socket(AF_INET,SOCK_STREAM,0);
        if(s_fd == -1)
        {
                perror("socket");
                exit(-1);
        }

        struct sockaddr_in s_addr;
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(8989);
        inet_aton("10.100.13.165",&s_addr.sin_addr);
		
        //2.bind
        bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));

        //3.listen 
        listen(s_fd,10);

        //4.accept
        int c_fd = accept(s_fd,NULL,NULL);

        printf("connect\n");
        while(1)

        return 0;
}

编译运行,用telnet 10.100.13.165 8989

编译结果:

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

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

相关文章

屏幕录制安卓应用被发现在监视用户

据 ESET 的研究人员称&#xff0c;一款在 Google Play 商店中下载量超过 50,000 次的屏幕录像机应用程序被发现使用设备的麦克风悄悄地录制音频并窃取文件&#xff0c;这表明它可能是间谍活动的一部分。 iRecorder 是一个合法的应用程序&#xff0c;于 2021 年 9 月可用&#…

chatgpt赋能python:Python动态函数介绍

Python动态函数介绍 Python是一种高级编程语言&#xff0c;它支持动态函数。动态函数就是在Python中可以在运行时创建函数。这意味着编程者可以在编写代码时不必事先定义所有函数&#xff0c;而是可以通过Python函数来创建函数。 Python动态函数的一个好处是可以轻松地编写可…

chatgpt赋能python:Python动态列表介绍

Python动态列表介绍 Python是一种常用的高级编程语言&#xff0c;它支持多种数据结构&#xff0c;其中包括列表。以Python中的列表为例&#xff0c;本文将详细介绍Python动态列表的特点和用途。 Python中的列表 在Python中&#xff0c;列表就是一组由逗号分隔&#xff0c;放…

基于PyQt5的图形化界面开发——队列动画演示

目录 0. 前言1. 了解队列2. 代码实现3. 效果演示其他PyQt5文章 0. 前言 本文使用PyQt5制作图形化界面演示数据结构中的队列操作&#xff0c;与上一节队列动画相对应 基于PyQt5的图形化界面开发——队列动画演示 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;P…

javascript基础十六:Ajax 原理是什么?如何实现?

一、是什么 AJAX全称(Async Javascript and XML) 即异步的JavaScript 和XML&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c;可以在不重新加载整个网页的情况下&#xff0c;与服务器交换数据&#xff0c;并且更新部分网页 Ajax的原理简单来说通过XmlHttpRequ…

Linux编辑器,开机重启,用户注销,用户管理 常用命令

Linux 实操篇- Vi 和Vim 编辑器 vi 和vim 的基本介绍 Linux 系统会内置vi 文本编辑器 Vim 具有程序编辑的能力&#xff0c;可以看做是Vi 的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特…

环境感知算法——4.RandLA-Net基于SemanticKITTI训练

1.前言 RandLA-Net&#xff08;Random Sampling and Local Feature Aggregator Network&#xff09;是一种处理点云数据的神经网络结构&#xff0c;采用随机采样&#xff08;Random Sampling, RS&#xff09;以降低点云密度并减少计算量。尽管随机采样可能会丢掉一些有用的信息…

【 STM32实例 】 智能小车的红外循迹

文章目录 前言一、硬件选择与连接1. STM32F103C8T6最小系统板2. L298N双路电机驱动3. 红外循迹模块 二、环境配置1. Device2. Output3. C/C4. Debug 三、项目管理与代码实现1. 项目结构2. 工程管理3. 具体文件xunji.cxunji.hmain.c 总结项目源码 前言 这篇文章我主要讲的是让基…

chatgpt赋能python:Python加颜色代码-提高代码可读性和吸引力的简单技巧

Python加颜色代码 - 提高代码可读性和吸引力的简单技巧 在编写Python代码时&#xff0c;您可能已经注意到&#xff0c;有时候需要强调某些部分&#xff0c;以使其更易于阅读和理解。这时候&#xff0c;您可以使用加颜色代码来增强代码的可读性和吸引力。在本文中&#xff0c;我…

Opencv项目实战:基于dlib的人脸关键点检测

文章目录 一、项目简介二、环境配置2.1、dlib人脸检测器&#xff1a;dlib.get_frontal_face_detector()2.2、dlib关键点定位工具&#xff1a;shape_predictor_68_face_landmarks.dat 三、项目实战 一、项目简介 该项目基于dlib模块提供的人脸检测器以及关键点定位工具完成。首…

大数据:hive数据库的操作语法,数据表,内部表,external外部表,数据导入导出load,insert

大数据&#xff1a; 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&#xff0c;尤其sql要学&#x…

chatgpt赋能python:关于Python中打开文件的语句详解

关于Python中打开文件的语句详解 在Python中&#xff0c;打开文件是一项常见的任务&#xff0c;可以用于读写文件和进行日志记录。本文将介绍Python中打开文件的语句&#xff0c;并提供一些实用技巧&#xff0c;以便方便地管理文件。 为什么需要打开文件&#xff1f; 在计算…

【动态规划】通配符匹配与正则表达式匹配

文章目录 一、通配符匹配1.1 思路分析1.2 初始化处理1.3 代码1.4 优化 二、正则表达式匹配2.1 思路分析2.2 初始化设置2.3 代码 一、通配符匹配 题目描述&#xff1a; 给你一个输入字符串 (s) 和一个字符模式 &#xff0c;请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符…

如何在Github上免费部署网站

如何在Github上免费部署静态网站 背景一、新建仓库&#xff08;github账号的需要注册&#xff09;二、下载仓库三、将内容上传到远程仓库里四、启动Page服务 背景 部署网站需要服务器&#xff0c;但是如果你只是部署静态网站就可以蹭Github上的免费服务器。因为发现现在的过程…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 基于session和redis实现登录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;导入资源&#xff08;三&#xff09;短信…

Spring数据库事务处理

数据库事务的基本知识 ACID 两类丢失更新 事务回滚丢失更新&#xff1a; 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制&#xff1a; 锁可以分为乐观锁和悲观锁&#xff0c;而悲观锁又分为&#xff1a;读锁(共享锁)和写锁(排它锁)&#xff0c;…

chatgpt赋能python:使用Python制作动画的步骤和工具

使用Python制作动画的步骤和工具 Python不仅是一种流行的编程语言&#xff0c;还可以用于制作动画。本文将介绍一些基本步骤和工具&#xff0c;帮助你制作出精美的动画作品。 步骤一&#xff1a;选择一个好的动画框架 Python有很多强大的动画框架可以使用。其中一些最受欢迎…

chatgpt赋能python:Python删除目录下文件:介绍和方法

Python删除目录下文件&#xff1a;介绍和方法 在日常的开发和运维工作中&#xff0c;我们可能会需要删除某个目录下的一些文件。使用Python的好处在于其强大的处理能力和简单易用的语法。本文将介绍Python删除目录下文件的方法&#xff0c;并提供一些实用的代码示例。 使用os…

java-数组和方法

java-数组和方法 一、数组 1.1 概念 数组就是存储数据长度固定的容器&#xff0c;存储多个数据的数据类型要一致。 1.2 定义格式 第一种 数据类型 [] 数组名 例: int[] arr; double[] arr; char[] arr;第二种 数据类型 数组名[] 例: int arr[]; doubl…

交流有功功率、无功功率、视在功率计算

交流有功功率、无功功率、视在功率计算 1、有功功率2、无功功率3、视在功率4、功率因数5、总结 1、有功功率 有功功率&#xff1a;在交流电路中&#xff0c;每个瞬时的有功功率是不同的&#xff0c;且不断变化&#xff0c;一般用平均有功功率&#xff08;一个周期内功率的平均…