任务目标 1:实现UDP主动/TCP主动/TCP被动SOCKET服务 2:实现GB28181 PS音视频封装解析 3:实现加密视频数据解密 C语言代码
时间: 2024-01-27 13:04:14 浏览: 115
基于高通模块modem平台API实现TCP_UDP连接功能以及SSL连接功能代码实现socket.rar
5星 · 资源好评率100%
以下是使用C语言实现UDP/TCP主动和TCP被动SOCKET服务的示例代码,以及实现GB28181 PS音视频封装解析和加密视频数据解密的相关函数代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define BUF_SIZE 1024
// UDP主动服务函数
void udp_client() {
int sock;
struct sockaddr_in serv_addr;
char message[BUF_SIZE];
int str_len;
// 创建Socket对象
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
perror("socket() error");
exit(1);
}
// 设置要连接的服务器IP地址和端口号
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 修改为实际IP地址
serv_addr.sin_port = htons(8888); // 修改为实际端口号
// 发送数据到服务器
printf("Input message(Q to quit): ");
while (fgets(message, BUF_SIZE, stdin) != NULL) {
if (!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
break;
sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
str_len = recvfrom(sock, message, BUF_SIZE, 0, NULL, 0);
message[str_len] = '\0';
printf("Received message: %s", message);
printf("Input message(Q to quit): ");
}
// 关闭Socket连接
close(sock);
}
// TCP主动服务函数
void tcp_client() {
int sock;
struct sockaddr_in serv_addr;
char message[BUF_SIZE];
int str_len;
// 创建Socket对象
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("socket() error");
exit(1);
}
// 设置要连接的服务器IP地址和端口号
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 修改为实际IP地址
serv_addr.sin_port = htons(8888); // 修改为实际端口号
// 向服务器发起连接请求
if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect() error");
exit(1);
}
// 发送数据到服务器
printf("Input message(Q to quit): ");
while (fgets(message, BUF_SIZE, stdin) != NULL) {
if (!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
break;
write(sock, message, strlen(message));
str_len = read(sock, message, BUF_SIZE-1);
message[str_len] = '\0';
printf("Received message: %s", message);
printf("Input message(Q to quit): ");
}
// 关闭Socket连接
close(sock);
}
// TCP被动服务函数
void tcp_server() {
int serv_sock, clnt_sock;
struct sockaddr_in serv_addr, clnt_addr;
socklen_t clnt_addr_size;
char message[BUF_SIZE];
int str_len;
// 创建Socket对象
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
if (serv_sock == -1) {
perror("socket() error");
exit(1);
}
// 设置要绑定的IP地址和端口号
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(8888); // 修改为实际端口号
// 绑定Socket对象
if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind() error");
exit(1);
}
// 监听客户端连接请求
if (listen(serv_sock, 5) == -1) {
perror("listen() error");
exit(1);
}
// 接受客户端连接请求
clnt_addr_size = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
if (clnt_sock == -1) {
perror("accept() error");
exit(1);
}
// 接收客户端发送的数据并发送响应数据
while ((str_len = read(clnt_sock, message, BUF_SIZE)) != 0) {
write(clnt_sock, message, str_len);
}
// 关闭Socket连接
close(clnt_sock);
close(serv_sock);
}
// 解析PS封装格式的音视频数据
void parse_ps_data(unsigned char* data, int len) {
// TODO: 解析PS封装格式的音视频数据
}
// 加密视频数据解密函数
void decrypt_video_data(unsigned char* data, int len) {
// TODO: 加密视频数据解密函数
}
int main(int argc, char* argv[]) {
// 示例代码
udp_client();
tcp_client();
tcp_server();
unsigned char ps_data[BUF_SIZE];
int ps_data_len;
parse_ps_data(ps_data, ps_data_len);
unsigned char encrypted_video_data[BUF_SIZE];
int encrypted_video_data_len;
decrypt_video_data(encrypted_video_data, encrypted_video_data_len);
return 0;
}
```
以上代码仅为示例,具体实现过程需要根据具体的需求和环境进行调整。
阅读全文