首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C数组初始化为自定义字符

将C数组初始化为自定义字符
EN

Stack Overflow用户
提问于 2018-12-17 01:12:13
回答 1查看 56关注 0票数 -1

我已经构建了一个Winsock2服务器。该程序的一部分具有从客户端接收数据的功能。最初,我构建的接收函数将查看传入的数据,并在允许recv()从缓冲区中拉出数据之前确定是否有其他数据要读取。这在项目开始时工作得很好,但我现在正在努力提高性能。

以下是我为消除peek的使用而编写的代码的一部分:

代码语言:javascript
运行
复制
    unsigned char recv_buffer[4096];
    unsigned char *pComplete_buffer = malloc(sizeof(recv_buffer) * sizeof(unsigned char*));
    int offset = 0;
    int i = 0;

    ...

    for (i; i <= sizeof(recv_buffer); i++) {
        if (recv_buffer[i] == NULL) {
            break;
        }
        pComplete_buffer[offset] = recv_buffer[i];
        offset++;
    }

    ...

这段代码可以很好地工作,但问题是NULL == 0。如果客户端碰巧发送了0,则此循环将过早中断。我想我应该聪明一点,不把数据初始化成0xcc,然后用它来确定recv_buffer的结尾,但似乎客户有时也会把它作为数据的一部分发送出去。

问题:

有没有一个我可以初始化recv_buffer并可靠地中断的字符?

如果没有,有没有其他方法可以消除peek的使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-18 09:05:36

正确的解决方案是首先跟踪您在recv_buffer中存储的字节数。sizeof()给出了缓冲区可能的总大小,但它不会告诉您实际包含多少字节的有效数据。

recv()会告诉你它返回给你的字节数。当您将数据recv()recv_buffer中时,使用该返回值递增您定义的变量,该变量用于指示recv_buffer中的有效字节数。

例如:

代码语言:javascript
运行
复制
unsigned char recv_buffer[4096];
int num_read, recv_buffer_size = 0;

const int max_cbuffer_size = sizeof(recv_buffer) * sizeof(unsigned char*);
unsigned char *pComplete_buffer = malloc(max_cbuffer_size);

...

num_read = recv(..., recv_buffer, sizeof(recv_buffer), ...);
if (num_read <= 0) {
    // error handling...
    return;
}
recv_buffer_size = num_read;

...

int available = max_cbuffer_size - offset;
int num_to_copy = min(recv_buffer_size, available);

memcpy(pComplete_buffer + offset, recv_buffer, num_to_copy);
offset += num_to_copy;
memmove(recv_buffer, recv_buffer + num_to_copy, recv_buffer_size - num_to_copy);
recv_buffer_size -= num_to_copy;

...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53804585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档