packet_pop.h

/* 

  *文件名 packet_pop.h

  *描述:从数据包的数据体取出数据

 */


#ifndef _PACKET_POP_H

#define _PACKET_POP_H


class CPacketPop

{

  public:

                //@len src_data指向的数据的长度

CPacketPop(char *src_data,int len);

CPacketPop();

~CPacketPop();

public:

                //初始化对象

Init(char *src_data,int len);


//从数据缓存中取一个char类型数据

                //返回值:成功时返回读取数据的字节总数

//否则返回以下错误代码:

               //1 如果数据缓存为空 返回ERR_NO_DATA

               //如果数据缓存中的未读数据的长度小于要读取的数据长度时,返回ERR_BUFF_LESS_DATA

              int PopChar(char &c);

              //从数据缓存中取一个unsigned char类型数据

               int PopUChar(unsigned char &uc);


//从数据缓存中取一个short类型数据

int PopShort(short &s);

            //从数据缓存中取一个unsigned short类型数据

int PopUShort(unsigned short &us);


//从数据缓存中取一个int类型数据

int PopInt(short &i);

            //从数据缓存中取一个unsigned int类型数据

int PopUInt(unsigned int&ui);


//从数据缓存中取一个64位整数

int PopInt64(long long &i);

}


//从数据缓存中取一个float类型数据

int PopFloat(float &f);

//从数据缓存中取一个double类型数据

int PopDouble(double &d);


/*

  *函数功能:从数据缓存中取出一个字符串,并且在字符串尾部添加结束符‘\0’

  *输入参数:@buff 用于存放取出字符串的缓存

                        @buff_size  @buff指向缓存的字节大小

  *返回值:字符串长度

*/

int PopVS(char *buff,int buff_size);


/*

 *函数功能:从数据缓存中取出数据,并且检查输入缓存大小

 *字符串遵循协议【字符串长度,字符串】

*输入参数:

                      @buff_size  @buff指向缓存的字节大小

 *返回取出数据的长度

*/

int PopBuff(char *buff,int buff_size);


//提取一块字符串,如果字符串大于0返回字符串指针,len为字符串的长度;否则返回NULL。

char *PopBuff(int &str_len);


//获取offset

int GetOffset();


//获取数据长度

int GetLength();


private:

           char *m_data;

           int m_len;

           int m_offset;

}


#endif



运行#include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <ws2tcpip.h> // 链接Winsock库 #pragma comment(lib, "ws2_32.lib") #define XPLANE_PORT 49000 #define SERVER_IP "127.0.0.1" int main() { WSADATA wsaData; SOCKET sockfd; struct sockaddr_in server_addr; // 初始化Winsock if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { fprintf(stderr, "WSAStartup failed. Error: %d\n", WSAGetLastError()); return EXIT_FAILURE; } // 创建套接字 if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { fprintf(stderr, "Socket creation failed. Error: %d\n", WSAGetLastError()); WSACleanup(); return EXIT_FAILURE; } memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(XPLANE_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); // 注意:inet_addr不支持IPv6 // 如果使用IPv6,可以使用InetPton函数 // 例如:InetPton(AF_INET, SERVER_IP, &server_addr.sin_addr); // 构造数据包(与之前相同) struct xplane_data_packet { char header[5]; // "DATA" int data_id; // 数据ID float values[128]; // 128个浮点数 } packet; strcpy_s(packet.header, sizeof(packet.header), "DATA"); packet.data_id = 123; // 示例数据ID for (int i = 0; i < 128; ++i) { packet.values[i] = 0.0f; } packet.values[0] = 0.5f; // 襟翼位置 // 发送数据包 if (sendto(sockfd, (const char*)&packet, sizeof(packet), 0, (const struct sockaddr*)&server_addr, sizeof(server_addr)) == SOCKET_ERROR) { fprintf(stderr, "sendto failed. Error: %d\n", WSAGetLastError()); closesocket(sockfd); WSACleanup(); return EXIT_FAILURE; } printf("Packet sent to X-Plane\n"); // 关闭套接字并清理Winsock closesocket(sockfd); WSACleanup(); return 0; } 后x-plane弹出BE ADVISED Not enough data-out array indices! index=2077019340 dimension=139并退出
07-06
void *decode_thread(void *arg) { AVCodecContext *decoder = init_sw_decoder(); if (!decoder) { fprintf(stderr, "Failed to initialize software decoder\n"); return NULL; } while (1) { VideoFrame frame = frame_queue_pop(&g_decode_queue); // 解码帧 AVPacket pkt; av_init_packet(&pkt); pkt.data = frame.data; pkt.size = frame.size; if (avcodec_send_packet(decoder, &pkt) == 0) { AVFrame *av_frame = av_frame_alloc(); if (avcodec_receive_frame(decoder, av_frame) == 0) { // 创建显示帧 if(av_frame->width!=video_width || av_frame->height!=video_height){ video_width = av_frame->width; video_height = av_frame->height; if (g_rgb_buf) free(g_rgb_buf); if (g_sws_ctx) sws_freeContext(g_sws_ctx); g_rgb_buf = (uint8_t *)malloc(video_width * video_height * 4); g_sws_ctx = sws_getContext( video_width, video_height, av_frame->format, video_width, video_height, AV_PIX_FMT_BGRA, SWS_BILINEAR, NULL, NULL, NULL ); } VideoFrame display_frame; display_frame.data = malloc(BUF_SIZE); display_frame.size = BUF_SIZE; display_frame.pts = frame.pts; uint8_t *dst[1] = { g_rgb_buf }; int dst_linesize[1] = {video_width * 4}; sws_scale(g_sws_ctx, (const uint8_t * const *)av_frame->data, av_frame->linesize, 0, video_height, dst, dst_linesize); memcpy(display_frame.data, av_frame, BUF_SIZE); // YUV数据 // 推入显示队列 if (frame_queue_push(&g_display_queue, display_frame) != 0) { free(display_frame.data); // 队列满时丢弃 } } av_frame_free(&av_frame); } av_packet_free(&pkt); } avcodec_free_context(&decoder); return NULL; } 报错了
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值