• 提交后出现报错
    run evaluation script error: run_evaluation.sh: line 4: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)始终显示上述报错,没有得分,我提交的是solution.zip文件夹,里面只包含了solution.cpp,这样是正确的吗 
  • [问题求助] 35分数问题
    35的分数已经问了很多次了,如果不改的话请发个声明,最长最短其实差不多,给个声明确认一下。
  • [技术干货] C/C++ Linux网络编程12 - 传输层UDP协议详解-转载
    一. 端口号与四元组        之前说过,在网络中使用端口号来标识某一个主机中的某一个进程。不用进程pid是为了实现操作系统和网络之间的解耦。        在网络中,使用(源IP,源端口,目的IP,目的端口,传输层协议)来标识一个网络连接。        可以看到,一般来说服务器的IP是固定的,为了支持不同的网络服务,就需要对端口进行规划。这样就方便客户端的访问。1.1 端口划分0 ~ 1023 是知名端口后,属于某些应用层协议1024~65535由用户(OS)自行分配,用于支持不同的应用。常用的知名端口号:ssh:22        ftp:21        telnet:23        http:80        https:443当然还有这些不知名的知名端口MySQL:3306        Redis:63791.2 netstat命令这个命令是用于查看机器中的网络状态的。参数如下:netstat:用于查看网络状态(本地链接和服务) 参数:n:拒绝使用别名,将显示为数字的全部显示为数字l:仅展示目前正在listen(监听的)网络服务p:显示网络服务相关的进程(程序名)t:显示tcp协议的网络服务u:显示udp协议的网络服务a:显示所有的状态(默认不会显示listen的状态)一般使用 netstat -nltp使用如下:  1.3 pidof        有时候我们netstat之后需要知道这个网络服务的名称,使用pidof 进程名称 可以快速获取这个名称所对应的进程pid。当然你使用ps + grep 命令也是没有问题的! 二. UDP协议udp是传输层协议,用于解决两个节点之间的数据如何传输的问题。UDP的特性是:不保证可靠传输,无连接,面向数据报。2.1 UDP协议报头格式如下: UDP的报头长度是8字节。可以看到,源端口,目的端口,报文长度和校验和都是2字节。也就是16位。这也表示了我们使用接口时候为何使用uint16_t定义端口,这是下层协议规定的。它们的作用如下:源端口:这个报文的来源端口目的端口:这个报文将要发送的目的端口报文长度:数据报的长度,理论最长是2^16 - 1 = 65535字节。(如果考虑IP协议就不一样)校验和:用于比对这个报文是否错误。如果校验和出错,这个报文直接丢弃其实所谓的报头并不难理解,本质是一种结构化数据。struct udp_hdr{    uint16_t src_port;    uint16_t dsc_port;    uint16_t length;    uint16_t check;}AI写代码<源端口,目的端口> 保证对方接受我们的数据,对方拿到我们的数据报之后,先判断是否出错,如果没有出错就获取报文长度,然后获取报文的数据。2.2 UDP特点1 无连接:只要知道对方IP和端口就能发送数据,无需事先建立连接2 面向数据报:不能灵活控制发送数据的次数和数量3 不保证可靠传输:没有确认机制,没有重传机制。我发送我的,你有没有收到我不关心2.3 UDP缓冲区        我们使用的网络IO接口,send sendto write recv recvfrom recv read 等接口不是发送接收接口,而是拷贝接口        发送数据的时候本质是拷贝到传输层的发送缓冲区,接收数据的时候本质是从传输层接收缓冲区拷贝到我们的内存中        全双工:双方都有接收缓冲区和发送缓冲区。所以双方能同时接收和发送数据        如果站在应用层的角度,我们将数据直接交给下层的传输层就不管了,剩下的工作交给传输层。我们接收数据直接从缓冲区拿。        这样应用层就能节省大量时间,不用关心数据到底是怎么来的,怎么发送到对方UDP其实没有严格的发送缓冲区,只有接收缓冲区。因为:UDP的发送缓冲区是非阻塞立即发送的UDP sendto几乎是直接交给OS由OS发送UDP recvfrom接收数据时候,如果缓冲区满了就会直接丢弃后续的报文2.4 UDP协议使用注意UDP报文的长度最大是2^16 -1 大约64kb,如果不考虑下层协议。应用层数据包超过65535字节就需要自己进行分包处理2.5 基于UDP协议的应用层协议和场景DNS域名解析协议DHCP简单文件传输协议QUIC HTTP3.0协议网络直播联机游戏————————————————版权声明:本文为CSDN博主「橘子真甜~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/yzcllzx/article/details/155787862
  • 35分数问题
    35期是不是不修改了,不修改的话是按照判题器(求最长)还是按照pdf写(求最短)??
  • [技术干货] 33期存在问题
    33期根据main.c的代码可以发现存在以下问题:hac_enc和hac_merge为简单字符串处理加sleep,线上环境并没有替换为真实处理流程,完全可以在user_process中手动计算以代替hac_enc和hac_merge函数。hac_enc和hac_merge在处理完任务后并没有将对应HACDevice设置为HAC_IDLE状态,因此每个线程只能进行一次数据加工,后续都会处于忙状态。分数的计算公式不明,和pdf描述不一致,无论HAC_TYPE_MERGE类型的设备使用与否都不影响分数。希望官方能尽早修复以上问题。以下是一个当前最高分110分的实现:#include <stdio.h> #include <stdlib.h> #include "common.h" typedef struct { char *enc_results[2]; char *merge_results[2]; sem_t sem; } UserData; UserData user_data; void user_init(SystemData *system_data) { sem_init(&user_data.sem, 0, 0); } void user_process(SystemData *system_data) { hac_enc(0, "", &user_data.enc_results[0]); hac_enc(1, "", &user_data.enc_results[1]); hac_merge(0, "", "", &user_data.merge_results[0]); hac_merge(1, "", "", &user_data.merge_results[1]); size_t result_len = 0; for (int i = 0; i < system_data->input_count; i++) { result_len += strlen(system_data->input_data[i]); } system_data->output_buffer = malloc(result_len + 1); char *p = system_data->output_buffer; for (int i = 0; i < system_data->input_count; ++i) { sprintf(p, "%s+++", system_data->input_data[i]); p += strlen(system_data->input_data[i]) + 3; } for (int i = 0; i < 4; ++i) { sem_wait(&user_data.sem); } sem_close(&user_data.sem); } void user_hac_enc_complete(int hac_id, char *result) { sem_post(&user_data.sem); } void user_hac_merge_complete(int hac_id, char *result) { sem_post(&user_data.sem); }
  • 29 30 31 奖金问题
    29 30 31 还会发奖金吗
  • [问题求助] 关于35期评分函数问题
    根据评分函数是总长度越短越好,但是我不断调整算法降低长度,分数越来越低,求解释
  • 35期分数问题
    按照pdf中的要求,找到环基的总长度越短,分数越高,但是线上的分数似乎是长度越长分数越高,确定计算分数的代码没有问题吗?
  • [问题求助] 34baseline问题
    34baseline是不是合理的呢,之前必死啊的最高分都没到6000,感觉理论上线也到不了7000,29-34都有一堆问题,相对来说34算是比较正常的,希望官方能重视,别浪费这么好的题目了。。。
  • 33期提交问题
    请问提交格式是怎么样的,提交一直报错
  • [交流吐槽] 应用介绍表述太不清晰了
    请看IMG在编程语言支持一栏显示是对C/C++有支持的,但是实际用起来的时候并没有相应的编译环境。这段表述太模糊了,请注意标点符号的使用。
  • [问题求助] C代码使用put_object流式上传数据流到桶,报错AbortedByCallback:37
    必现报错{8636} put object from buffer failed(AbortedByCallback-37).
  • 关于二十七期打榜排名分数相同问题的疑问
     注意到华为算法精英实战营第二十七期比赛中,有多位参赛者提交的作品最终得分完全相同,这一情况引发了一些疑问,因为根据我个人的线上提交测试经验,程序关键部分即使进行细微修改,得分通常也会随之变化,极少出现完全一致的情况。鉴于上述测试经验与当前观察到的现象存在显著差异,我恳请主办方核查这些得分高度雷同的参赛作品及其提交者身份是否存在关联性,以确保比赛的公平公正。  
  • [问题求助] 第二十七期 process run timeout 报错
    试了很多次要么报错general_error, 要么报错process run timeout。 感觉是线上环境除了问题,请官方检查一下判题目器,或者给出一个可提交通过的样例。
  • [技术干货] 'inet_addr': Use inet_pton() or InetPton() instead
    这个警告是因为 inet_addr() 是旧版 WinSock API,已被标记为废弃(deprecated),微软推荐使用更安全的 InetPton()(Windows)或跨平台的 inet_pton()(POSIX)替代。以下是解决方案:方法 1:使用 InetPton()(推荐,Windows 专用)InetPton() 是 inet_addr() 的现代替代品,支持 IPv4 和 IPv6,且能检测无效 IP 格式。示例代码#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> // 需要包含此头文件 #pragma comment(lib, "ws2_32.lib") bool IsNetworkAvailable() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return false; } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { WSACleanup(); return false; } // 设置超时(可选) DWORD timeout = 3000; // 3秒 setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)); setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout)); // 使用 InetPton 替代 inet_addr sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(53); if (InetPtonA(AF_INET, "8.8.8.8", &addr.sin_addr) != 1) { closesocket(sock); WSACleanup(); return false; // IP 格式无效 } bool isConnected = (connect(sock, (sockaddr*)&addr, sizeof(addr)) == 0); closesocket(sock); WSACleanup(); return isConnected; } int main() { if (IsNetworkAvailable()) { std::cout << "Network is available.\n"; } else { std::cout << "Network may be down or restricted.\n"; } return 0; } 关键改进更安全的 IP 解析:InetPton() 能检测无效 IP(如 "256.1.1.1"),而 inet_addr() 会静默返回 INADDR_NONE。支持 IPv6:改用 AF_INET6 和 InetPtonW()(宽字符版)即可支持 IPv6。方法 2:使用 inet_pton()(跨平台,POSIX 标准)如果代码需要跨平台(Linux/macOS/Windows),可以使用 inet_pton()(需定义 _WIN32_WINNT >= 0x0600 或包含 <ws2tcpip.h>)。示例代码#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> // 必须包含此头文件 #pragma comment(lib, "ws2_32.lib") bool IsNetworkAvailable() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return false; } SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == INVALID_SOCKET) { WSACleanup(); return false; } sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(53); // 使用 inet_pton(跨平台) if (inet_pton(AF_INET, "8.8.8.8", &addr.sin_addr) != 1) { closesocket(sock); WSACleanup(); return false; // IP 格式无效 } bool isConnected = (connect(sock, (sockaddr*)&addr, sizeof(addr)) == 0); closesocket(sock); WSACleanup(); return isConnected; } 方法 3:临时禁用警告(不推荐)如果暂时不想修改代码,可以定义 _WINSOCK_DEPRECATED_NO_WARNINGS 来屏蔽警告:#define _WINSOCK_DEPRECATED_NO_WARNINGS #include <winsock2.h> // 其余代码不变... 缺点:只是隐藏警告,并未解决潜在的安全问题。总结方法适用场景优点缺点InetPton()Windows 专用安全、支持 IPv4/IPv6仅限 Windowsinet_pton()跨平台标准 POSIX,兼容 Linux/macOS需确保头文件正确禁用警告临时兼容旧代码快速解决编译警告不推荐长期使用最佳实践Windows 优先用 InetPton()(更现代)。跨平台代码用 inet_pton()(需检查平台兼容性)。避免 inet_addr(),因为它无法处理 IPv6 且不检查无效 IP。
总条数:152 到第
上滑加载中