簡體   English   中英

將C數組初始化為自定義字符

[英]Initialize C array to custom character

我建立了一個Winsock2服務器。 該程序的一部分具有從客戶端接收數據的功能。 最初,我構建的接收函數將監視傳入的數據,並在允許recv()從緩沖區提取數據之前確定是否有任何其他數據要讀取。 在項目開始時,此方法運行良好,但我現在正在努力提高性能。

這是我為消除對peek的使用而編寫的部分代碼:

    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的使用嗎?

正確的解決方案是跟蹤您開始存儲在recv_buffer字節數。 sizeof()提供了緩沖區的TOTAL POSSIBLE大小,但它沒有告訴您實際上有多少字節包含有效數據。

recv()告訴您返回多少字節。 recv()數據存儲到recv_buffer ,使用該返回值遞增定義的變量,以指示recv_buffer的有效字節recv_buffer

例如:

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;

...

是否可以初始化recv_buffer並可靠中斷的字符?

不。 如果對方可以隨時發送任何字符,則必須檢查它們。

如果您知道發件人永遠不會連續發送兩個 NUL\\0\\0 ),則可以進行檢查。 但是有一天,發件人將決定這樣做。

如果您可以更改消息結構,那么我將首先發送消息長度(以字節為單位,取決於您的協議,網絡順序為short或int)。 然后,在解析該長度之后,接收器將確切知道要繼續讀取多長時間。 另外,如果您使用的是select ,它將阻塞直到有需要閱讀的內容或套接字關閉(主要是-閱讀文檔)為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM