Socket编程基础

2023-11-16

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


rtsp实时音视频开发实战课程:
socekt实现TCP/UDP通信代码实现

前言

程序进程间通信方式之一就有socket,进程/程序可以通过socket和其他进程/程序进行数据的发送和接受。socket是网络编程的一种机制,socket使用TCP/UDP协议进行通信的。socket是程序中网络编程的一个组件,是对TCP/IP的封装。利用socket可以编写基于TCP/UDP的的网络通信代码。本篇文章主要介绍socket主要的网络编程API接口。


一、基于TCP的socket通信流程

socket通信是客服端-服务器模型,服务器监听,客户端请求,双方连接确认。
服务器端主要流程如下:
  1、创建socket,调用socket()函数;
  2、绑定主机IP地址、端口等信息到socket上,调用函数bind();
  3、监听客户端的连接,调用函数listen();
  4、接收客户端的连接,调用函数accept();
  5、收发数据,使用用函数send()和recv();
  6、关闭网络连接;
  7、关闭监听;
客户端的主要流程如下:
1、创建socket,调用socket()函数;
  2、设置要服务器IP地址和端口等属性;
  4、连接服务器,调用函数connect();
  5、收发数据,用函数send()和recv();
  6、关闭网络连接;
在这里插入图片描述

二、基于UDP的socket通信流程

服务器端主要流程是:
  1、创建socket,调用函数socket();
  2、绑定主机IP地址、端口等信息到socket上,调用函数bind();
  3、循环接收数据,调用函数recvfrom();
  4、关闭网络连接。
客户端主要流程是:
  1、创建一个socket,调用函数socket();
  2、设置对方的IP地址和端口等属性;
  3、发送数据,用函数sendto();
  4、关闭网络连接;
在这里插入图片描述

三、TCP协议下socket编程主要API接口介绍

有关socket API的介绍可以在https://man7.org/中搜索到:
  如socket: https://man7.org/linux/man-pages/man2/socket.2.html
  此外也可以在linux源码中查看到socket的实现,linux内核源码中相关api接口函数的实现函数名前包含"_sys",
   如socket()函数在linux内核中实现是__sys_socket()
   https://github.com/torvalds/linux/blob/master/net/socket.c
   https://github.com/torvalds/linux/blob/master/include/linux/socket.h
   通常socket的使用需要包含#include <sys/socket.h>头文件

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

socket函数的说明:https://man7.org/linux/man-pages/man2/socket.2.html
该函数用于创建一个通信端点;
domain参数指定一个通信域,主要有
  AF_UNIX:常用于本地通信
  AF_INET: 使用IPv4 互联网协议
  AF_INET6: 使用IPv6 Internet 协;
  其他。
type 类型,它指定通信语义:
   SOCK_STREAM:提供顺序的、可靠的、双向的、基于连接的字节流。一般使用TCP方式的是时候使 用这个参数。
  SOCK_DGRAM:无连接、不可靠的消息,一般UDP方式的时候用到这个参数。
  其他。
protocol 协议类型:
  IPPROTO_TCP: 指定TCP协议
  IPPROTO_UDP:指定UDP协议
  其他。
  protocol 在为0的情况下可以根据type 类型决定socket的通信类型,比如type 为SOCK_STREAM协议类型是TCP,type 为SOCK_DGRAM协议类型是UDP。
返回值:
  成功完成后, socket() 返回一个非负整数,即套接字文件描述符。否则返回值 -1 并设置 errno以指示错误 。

2、int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

bind函数的说明:https://man7.org/linux/man-pages/man2/bind.2.html
该函数一般用于服务端,将IP地址绑定到套接字。
**sockfd:**为socket返回的socket文件描述符。
**addr :**为要绑定的网络信息。addr 的类型是struct sockaddr:其定义如下

	 struct sockaddr {
	        sa_family_t sa_family;
	        char        sa_data[14];
	 }

在实际使用的时候根据需要(比如:需要绑定端口号和IP地址)可以使用struct sockaddr_in这个结构来替代 struct sockaddr,struct sockaddr_in结构定义如下:

	 struct sockaddr_in
	 {
	     sa_family_t sin_family; //地址协议类型,如AF_INET IPV4
	  	 uint16_t sin_port; //端口号,如554
		 struct in_addr sin_addr;//IP地址,如127.0.0.1
		 char sin_zero[8];
	 }
	 struct in_addr
	 {
	  	in_addr_t s_addr; 
	 }

addrlen:为addr结构体的长度。
返回值:
  成功时,返回零。出错时返回 -1,并设置 errno以指示错误。

3、int listen(int sockfd, int backlog);

listen函数的说明:https://man7.org/linux/man-pages/man2/listen.2.html
该函数一般用于服务端,将socket()创建的socket设置被动套接字,用于监听连接进来的socket。
  sockfd:为socket()创建的socket文件描述符。
  backlog:能够连接进来的最大socket数。该参数是一个队列最大数目用于存放连接进来的socket。
  返回值:成功时,返回零。出错时返回 -1,并设置 errno以指示错误。

4、socket、bind、listen函数使用的示例

struct  sockaddr_in inaddr;
    if (port <= 0)
	port = 554;
		
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (sockfd < 0) {
		PRINT_ERROR("create socket failed ret %d,%d: %s\n",ret, errno,strerror(errno));
	    return -1;
	}

    int  ret = 0;
	memset(&inaddr, 0, sizeof(inaddr));
	inaddr.sin_family = AF_INET;
	inaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	inaddr.sin_port = htons(port);
	ret = bind(sockfd, (struct sockaddr*)&inaddr, sizeof(inaddr));
	if (ret < 0) {
		PRINT_ERROR("bind socket to address failed : %s\n", strerror(errno));
		return -1;
	}
	
	ret = listen(sockfd, 20); //设置最大监听为20个
	if (ret < 0) {
		PRINT_ERROR("listen socket failed : %s\n", strerror(errno));
		return -1;
	}

	return sockfd;

关于网络字节序的说明:
  一般在将端口号和IP地址绑定到socket的时候需要使用htonl/htons将本地字节序转为网络字节序,其中htonl是将long形数据转网络字节序;htons是将short类型数据转为网络字节序。将本地字节序转为网络字节序是因为网络通信两端的机器可能存在不同的字节序类型,即大端或者小端;大端机和小端机在数据存储上顺序不同,如大端机存储顺序是地址的低位存储值的高位,小端机存储顺序是地址的低位存储值的低位。网络字节顺序采用大端机存储顺序方式;网络数据在双方传输接收后可以明确知道数据的存储顺序,可以保证数据在不同主机之间传输时能够被正确解析。

5、int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen);

accept函数的说明:https://man7.org/linux/man-pages/man2/accept.2.html
该函数一般用于服务端,用于接受一个套接字的连接,即完成客户端和服务端的连接过程(包含TCP的3次握手)。该函数从listen监听队列里面获取第一个连接,创建一个新的套socket,并返回socket文件描述符。
  sockfd:为socket()创建的被动socket文件描述符。
  addr:其类型是struct sockaddr结构体,结构体主要成员包含对端的IP地址,对端的端口号,addr包含了客户端的IP地址和端口号。
  addrlen:用于返回addr地址长度。
  返回值:成功时,返回socket文件描述符。出错时返回 -1,并设置 errno以指示错误

6、int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

connect函数说明:https://man7.org/linux/man-pages/man2/connect.2.html
该函数一般用于客户端,用于连接一个socket,向服务端发起连接。
  sockfd:为socket创建的socket文件描述符。
  addr:为要连接的对方的IP/端口号信息等,其结构体为struct sockaddr ,在实际使用的时候可以使用struct sockaddr_in这个结构来替代 struct sockaddr。
  addrlen:为addr结构体的长度。
  返回值:成功时,返回0。出错时返回 -1,并设置 errno以指示错误
connect函数的使用代码示例:

    struct sockaddr_in inaddr;
	short port=554;`
	memset(&inaddr, 0, sizeof(inaddr));
	inaddr.sin_family = AF_INET;
	inaddr.sin_addr.s_addr = inet_addr(peer_ip);//对方IP地址
	inaddr.sin_port = htons(port);//对方端口号
	ret = connect(*sockfd, (struct sockaddr*)&inaddr, sizeof(inaddr));
	if (ret < 0) {
		return -1;
	}    

7、ssize_t recv(int sockfd, void *buf, size_t len, int flags);

recv函数说明:https://man7.org/linux/man-pages/man2/recv.2.html
该函数通常用于TCP方式下接收对方的数据。
  sockfd:在服务端为accept()返回的文件描述符,在客户端为socket()函数返回的文件描述符。
  buf:要接收数据的缓存
  len:要接收数据的长度(不大于buf的大小)
  flags:为函数执行的附件标识,如MSG_DONTWAIT ,启用非阻塞操作,表示没有数据可接收不等待立刻返回。
  返回值:成功返回读入的字节数。如果连接已中止,返回0。如果发生错误,返回-1。
 与recv函数类似的函数还有recvfrom函数,如下:
 ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags,
struct sockaddr *restrict src_addr,
socklen_t *restrict addrlen);
通常UDP方式下的数据接受用recvfrom函数。函数的参数sockfd、buf、len、flags和recv一样。
   src_addr:为已经连接的对方的IP/端口号信息等,其结构体为struct sockaddr ,在实际使用的时候可以使用struct sockaddr_in这个结构来替代 struct sockaddr。
  addrlen:为src_addr结构体的长度。
  返回值:成功返回读入的字节数。如果发生错误,返回-1。

8、ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send函数说明:https://man7.org/linux/man-pages/man2/send.2.html
该函数用于往对方socket发送数据。
  sockfd:在服务端为accept()返回的文件描述符,在客户端为socket()函数返回的文件描述符。
  buf:要发送数据的缓存
  len:要发送数据的长度(不大于buf的大小)
  flags:为函数执行的附件标识,如MSG_DONTWAIT ,启用非阻塞操作。
  返回值:成功返回发送的字节数。出错时返回 -1,并设置 errno以指示错误。
与send函数类似的函数有sendto
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
通常UDP方式下的数据发送用sendto函数。函数的参数sockfd、buf、len、flags和send一样。
  dest_addr:为已经连接的对方的IP/端口号信息等,其结构体为struct sockaddr ,在实际使用的时候可以使用struct sockaddr_in这个结构来替代 struct sockaddr。
  addrlen:为dest_addr结构体的长度。
  返回值:成功返回发送的字节数。出错时返回 -1,并设置 errno以指示错误。
关于 flags的使用说明,如在MSG_DONTWAIT 的使用需要在每次调用recv/send函数的时候手动写入MSG_DONTWAIT 参数。如果有多个函数或者多个线程使用recv/send函数,就要写多次MSG_DONTWAIT 给flgs参数。代码比较多的时候可能容易遗忘。除此方法启用非阻塞操作外,在linux下可以使用fcntl函数API来设置socket的非阻塞操作。代码示例如下:

flgs= fcntl(sockfd, F_GETFL, 0);
if (flgs< 0) {
	PRINT_WARN("fcntl F_GETFL failed\n");
} else {
	flgs|= O_NONBLOCK;
	flgs= fcntl(sockfd, F_SETFL, flgs);
	if (flgs< 0) {
		PRINT_WARN("fcntl F_SETFL failed\n");
	}
}

fcntl(sockfd, F_GETFL, 0)通过使用F_GETFL来获取socket的“flgs”。flgs|= O_NONBLOCK;通过与操作将flas加上非阻塞的操作。通过fcntl(sockfd, F_SETFL, flgs)设置socket非阻塞的操作。
在windows下可以使用ioctlsocket接口来设控制socekt非阻塞的操作。代码示例如下:

unsigned long nonblocked = 1;
ret = ioctlsocket(sockfd, FIONBIO, &nonblocked);
if (ret < 0) {
	PRINT_WARN("ioctlsocket FIONBIO failed\n");
}

在通过ioctlsocket或fcntl设置了socekt的非阻塞的操作后调用recv/send函数时候flgs参数值为0即可。

四、socket编程其他有用的API

1、WSAStartup(WORD sockVersion,LPWSADATA lpWSAData)

在windows平台上创建socket前必须调用WSAStartup函数。WSAStartup函数完成对Winsock服务的初始化,之后才能调用socket的Api接口。
  sockVersion:Windows Sockets API提供的调用方可使用的最高版本号。高位字节代表次版本号,低位字节代表主版本号,可以使用MAKEWORD()来构造版本号,如MAKEWORD(2,2)。
  lpWSAData:WSAStartup函数调用后返回的 Windows Sockets数据。
  当使用了WSAStartup函数后socket关闭后须调用WSACleanup()将其从Windows Sockets的实现中注销,并释放分配的资源。

2、int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

setsockopt函数说明:https://man7.org/linux/man-pages/man2/setsockopt.2.html
该函数设置socket的属性。一般先调用getsockop(int sockfd, int level, int optname, void *restrict optval, socklen_t *restrict optlen)函数先获取socket的属性,如果属性已经设置无需再设置。
   sockfd:socket的文件描述符。
   level:指定的协议层。支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
   optname:通常为要设置的属性名称,主要有;
        SO_SNDBUF:设置发送缓存区大小
        SO_KEEPALIVE:设置保活开启/关闭。当SO_KEEPALIVE开启时,可以检测对方主机是否异常(如崩溃),避免一直阻塞在连接之中。
        TCP_KEEPINTVL:设置SO_KEEPALIVE之后一般还有设置TCP_KEEPINTVL来设置异常时探测数据发送的时间间隔。
        TCP_KEEPIDLE:设置SO_KEEPALIVE之后一般设置TCP_KEEPIDLE来设置保活时间阈值,如设置60,则超过60秒没有接收到对方数据认为对方异常,开始保活探测。
        TCP_KEEPCNT:设置尝试探测对方保活的最大次数,超出这个此时关闭连接。
        SO_LINGER:关闭socket的时候是否等待数据发送完。
        TCP_NODELAY:tcp关闭Nagle算法,允许小包的发送,即数据不管多大,有数据TCP就发送,可以达到发送小数据包低延时的目的。
        SO_REUSEADDR:地址重复使用。当程序推出后,比如kill掉之后又从新启动程序可能会出现“Address already in use”的错误提示,在创建scoket设置SO_REUSEADDR则可以解决该错误。
       
   optval:设置值的地址。
   optlen:optval缓冲区长度。
setsockopt函数的使用示例:

int flag = 1; /* Disable the Nagle (TCP No Delay) algorithm */
ret = setsockopt( sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag) );
if (ret == -1) {
  PRINT_WARN("Couldn't setsockopt(TCP_NODELAY)\n");
}
int sendbufsiz = 1024 * 512; //设置发送缓冲区512k
ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (const char*)&sndbufsiz, sizeof(sndbufsiz));
if (ret < 0) {
	PRINT_WARN("setsockopt SO_SNDBUF failed\n");
}
int keepalive  = 1;          //开启保活
ret = setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*)&keepalive, sizeof(keepalive));
if (ret < 0) {
	PRINT_WARN("setsockopt SO_KEEPALIVE failed\n");
}
int keepidle   = 60;         //设置保活时间60秒
ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (const char*)&keepidle, sizeof(keepidle));
if (ret < 0) {
	PRINT_WARN("setsockopt TCP_KEEPIDLE failed\n");
}
int keepinterval = 5;        //设置发送保活数据的时间间隔5秒
ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (const char*)&keepinterval, sizeof(keepinterval));
if (ret < 0) {
	PRINT_WARN("setsockopt TCP_KEEPINTVL failed\n");
}
int keepcount    = 3;        //设置发送保活数据的最大次数3,超过这个次数会关闭连接。
ret = setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (const char*)&keepcount, sizeof(keepcount));
if (ret < 0) {
	PRINT_WARN("setsockopt TCP_KEEPCNT failed\n");
}
struct linger ling;
memset(&ling, 0, sizeof(ling));
ling.l_onoff  = 1;
ling.l_linger = 0;
ret = setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&ling, sizeof(ling)); 
if (ret < 0) {
	PRINT_WARN("setsockopt SO_LINGER failed\n");
}

在windows下设置保活的接口为WSAIoctl(),使用示例如下:

struct tcp_keepalive keep_alive
keep_alive.onoff = 1;
keep_alive.keepalivetime     = 60000;      //保活时间60秒
keep_alive.keepaliveinterval = 3000;   //发送保活数据的时间间隔3秒
ret = WSAIoctl(sockfd, SIO_KEEPALIVE_VALS, &keep_alive, sizeof(keep_alive), 
	&alive_out, sizeof(alive_out), &alive_retlen, NULL, NULL);
if (ret == SOCKET_ERROR) {
	PRINT_WARN("WSAIoctl SIO_KEEPALIVE_VALS is failed\n");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket编程基础 的相关文章

  • 使用ffmpeg处理rtsp流url时出现未知命令失败

    我想使用ffmpeg从rtsp流中抓取图像 命令如下 ffmpeg y i rtsp zigong stream xl02 cn 557 HongTranSvr DevId 1b038d27 858c 46a1 b803 a2984af34
  • C# UDP广播和接收示例

    问题 我正在尝试将 udp 套接字绑定到特定地址 我会广播一条消息 同一个套接字需要能够接收消息 当前代码 static void Main UdpClient Configuration new UdpClient new IPEndPo
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • 如何设置Winsock UDP套接字?

    我想创建一个仅向客户端发送数据的 Winsock UDP 套接字 我希望内核为我选择一个可用的端口 另一方面 我想指出要使用哪个本地 IP 因为我正在运行一些网卡 我尝试过梳理迷宫般的套接字选项 以及将套接字地址中的端口绑定设置为 0 但均
  • 如何保持 RTSP 会话存活?

    我尝试在 Google Nexus S 2 3 7 HTC Desire 2 3 3 和 Samsung Galaxy 3 2 上进行流式传输 只有 Google Nexus 存在 RTSP 会话超时问题 我阅读了一些关于这个问题的帖子 似
  • Java UDP中如何获取实际数据包大小`byte[]`数组

    这是我上一个问题的后续问题 Java UDP发送 接收数据包一一接收 https stackoverflow com questions 21866382 java udp send receive packet one by one 正如
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • 接收来自 N 个客户端的响应,以回复通过 UDP 的广播请求

    我正在为特定类型的网络多媒体设备实现一种 IP 查找器 我想找出 LAN 中该类型的所有活动设备及其 IP 地址和其他详细信息 设备有自己的设备发现方式 其工作原理如下 客户端通过 UDP 通过 LAN 发送广播请求 目的端口号是固定的 作
  • UDP sendto 上的 ECONNREFUSED 错误

    我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto 向多个端口发送 UDP 数据 所有端口均使用套接字 PF INET SOCK DGRAM 0 为了一组客户端读取进程的利益 这些 sendto 偶尔会不可预测地触发经济
  • iOS 14 在进行本地网络广播时给出“操作系统错误:错误的文件描述符,errno = 9”

    做一点Jeopardy 风格问答 https stackoverflow blog 2011 07 01 its ok to ask and answer your own questions here 我正在 Flutter 中开发一个应
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • 致命错误:netinet/in.h:没有这样的文件或目录

    套接字编程 UDP 服务器 我正在尝试使用 UDP 服务器进行消息加密和解密 代码在这里 https www geeksforgeeks org message encryption decryption using udp server
  • Windows 操作系统中无法访问的 IP 套接字关闭时间

    这些代码通过用户数据报协议提供发送数据 下面有两个代码 当我使用第一个代码来处理无法访问的 IP 地址时 我得到了三秒的延迟 请查看新结果标题 只需打开新的 C 控制台应用程序并将这些代码粘贴到其中 第一个代码 using System u
  • Gstreamer、rtspsrc 和负载类型

    我在从特定摄像头检索 rtsp 流时遇到困难 因为摄像头提供的 rtp 有效负载类型是 35 未分配 并且该摄像头接受的有效负载类型rtph264德佩插件的范围是 96 127 结果是 gstreamer 显示如下错误
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的
  • 为多线程 UDP 客户端执行“close ()”时套接字描述符未释放

    我在下面编写了 UDP 客户端 它基本上生成一个单独的线程来接收数据报 但是数据报仅在主线程中发送 现在 在 Linux 发行版上实例化 udpClient 1 UDP 客户端后按 ctrl D 实现退出循环 围绕 getline 调用 并
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 为什么 SNMP 通常在 UDP 上运行而不是 TCP/IP 上?

    今天早上 工作中出现了大问题 因为 SNMP 陷阱没有 通过 因为 SNMP 是通过 UDP 运行的 我记得在大学网络课上 UDP 不能像 TCP IP 那样保证传输 维基百科说 SNMP 可以在 TCP IP 上运行 但 UDP 更常见
  • recvfrom() 中的 addrlen 字段有何用途?

    我在程序中使用 recvfrom 从我在 src addr 中指定的服务器获取 DGRAM 数据 但是 我不确定为什么需要初始化并传入addrlen 我读了手册页 但不太明白它的意思 如果src addr不为NULL 并且底层协议提供了源地

随机推荐

  • 流媒体协议部分开源库简单比对

    流媒体协议部分开源库简单比对 版本说明 版本 作者 日期 备注 0 1 ZY 2019 2 14 初稿 目录 文章目录 流媒体协议部分开源库简单比对 版本说明 目录 目前找到的比较中意的开源库 live555 media server JR
  • 如何用计算机打出平方,x的平方怎么在电脑上打出来(常见数学符号打法图文)...

    很多小白都会这样问 数学的平方 立方怎么打出来 诸如X Y Z 等等这些右下角的角标数字又是怎么打 根号怎么打出来 一些圆形符号 对数函数 极限符号 积分 尤其是定积分 又是怎么才能在pc端去打出来呢 本篇文章介绍几种比较基础的方法 拿平方
  • 第十三届蓝桥杯单片机客观题真题考点整理

    蓝桥杯 单片机设计与开发大赛马上就要进行 最后冲刺阶段将自己整理的资料上传一下 最后一个星期主要冲刺选择题 现在将选择题的考点附上 第八届预赛 单片机 定时器工作状态 晶振 中断优先级 IO口 数码管消隐 内存分布 IO口 复位 振荡器 模
  • PLC学习札记

    PLC概念相关 PLC编程 PLC系统 通过了解概念 知道了plc的核心是对继电器编程 什么是继电器 继电器 最后 阅读PLC指导手册 结合之前学习的知识 融会贯通 PLC编程手册 FX系列 pdf 指令表运行机制 仅限于本项目
  • 人脸识别解决方案全套文件大合集,120份全新精选,有这个就够了

    人脸识别解决方案全套文件大合集 120份全新精选 有这个就够了 一 人脸识别4个特点 二 人脸识别的 4 个步骤 三 人脸识别的 5 个难点 四 人脸识别算法的发展轨迹 五 人脸识别的典型应用 六 下载人脸识别全套解决方案 一 人脸识别4个
  • ubuntu14.04 Git Github环境搭建设置

    一 安装Git sudo apt get update 获得最近的软件包的列表 sudo apt get install git git core git gui git doc git svn git cvs gitweb gitk gi
  • python是完全面向对象的语言、并且完全支持_Python

    Python是一种高级动态 完全面向对象的语言 函数 模块 数字 字符串都是对象 并且完全支持继承 重载 派生 多继承 有益于增强源代码的复用性 运算语句 表达式 函数调用和赋值 各种类型的数据对象 可以通过各种运算组织成复杂的表达式 调用
  • 第一章 dolphinscheduler基础环境搭建

    官方链接 https dolphinscheduler apache org 1 准备工作 1 解压安装包 tar xzvf apache dolphinscheduler 1 3 9 bin tar gz C opt module apa
  • uni-app 1、app-plus的使用,#ifdef MP只兼容小程序

    最近开始查看uni app的一些项目 在pages json里面发现app plus 百度了下看见一些网友的解释是app跟h5端执行 小程序则不执行 只测试过微信小程序 据说其他小程序也不执行 代码如下 path pages index i
  • mysql中的全文索引

    查询操作在数据量比较少时 可以使用like模糊查询 但是对于大量的文本数据检索 效率很低 如果 使用全文索引 查询速度会比like快很多倍 在MySQL 5 6 以前的版本 只有MyISAM存储引擎支持全 文索引 从MySQL 5 6开始M
  • 《云计算-刘鹏》学习笔记-第一章:大数据与云计算

    文章目录 0 笔记说明 1 大数据时代 2 云计算 大数据的计算 3 云计算发展现状 4 云计算实现机制 5 云计算压倒性的成本优势 0 笔记说明 参考书籍为 云计算 第三版 作者为刘鹏 1 大数据时代 大数据的定义如下 海量数据或巨量数据
  • 概率论基础(sigma域、测度)

    一 样本空间 事件 样本空间 Omega 指一个实验的可能结果的集合 omega in Omega 称为 样本
  • 定时任务及分布式定时任务注意事项

    一 定时任务默认是阻塞的 定时任务默认是阻塞的 即串行执行 若一个服务配置多个定时任务 需要等上一个定时任务执行完 才能执行下一个定时任务 一个定时任务超长了 也不应该阻塞其他定时任务的执行 如一个定时任务每秒执行 而业务执行时间是5秒 那
  • vscode (1)直接编译

    第一步创建c文件 第二步配置 终端 配置默认生成任务 选择 usr bin gcc version 2 0 0 tasks type cppbuild label C C gcc 生成活动文件 command usr bin gcc 使用的
  • Stacked Queries(堆叠注入)

    文章目录 基本知识 原理介绍 堆叠注入的局限性 Mysql数据库实例介绍 CTF 实战与各种姿势 修改表名 利用HANDLER语句 利用MySql预处理 正常利用 MySql预处理配合十六进制绕过关键字 MySql预处理配合字符串拼接绕过关
  • jax安装

    Windows 安装 pip install jaxlib 0 3 5 f https whls blob core windows net unstable index html pip install jaxlib cuda111 f
  • Android开发工作中遇到的重点和难点总结

    1 Android N floating widget无法显示 统一管理一个window token解决了此问题 2 Pop up window在Android6 0上出现花屏 3 由于状态栏的影响 悬浮窗上下跳动 4 Wi Fi安全的数据
  • Windows下的oracle 11g的入门

    图全部都挂了 写的太累了 有空再来更 几个月没用oracle之后 花了一个下午把oracle的基本操作迅速捡回来了 记录如下 一 安装oracle11G 1 1 首先要下载oracle服务端和客户端 官网下载链接如下 http www or
  • content-type的几种取值

    目录 Content Type的几种取值 1 text plain 2 text html 3 application json 4 application xml 5 image jpeg 6 image png 7 audio mpeg
  • Socket编程基础

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 基于TCP的socket通信流程 二 基于UDP的socket通信流程 三 TCP协议下socket编程主要API接口介绍 1 int socket in