簡體   English   中英

Recvfrom和Wireshark

[英]Recvfrom and Wireshark

我與服務器通信,我用套接字(sock_raw ..)發送消息,它工作正常,客戶端(我),發送消息,服務器接收正確的消息,但是當服務器需要將消息發送給我時(客戶端),則客戶端不會使用recv從中檢索正確的信息。

我在兩個調用server-> client上檢索到此:

buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [2]

但是我的緩沖區需要等於此數據並具有以下大小:

首次調用(十六進制數據,含10個字節) 在此處輸入圖片說明

第二次調用(2字節的十六進制數據) 在此處輸入圖片說明

這就是我使用recvfrom函數的方式(t-> sock是服務器的套接字fd,t-> msg_recv是創建用於從servern接收味精的緩沖區,而t-> _ recv是用於接收的sockaddr *結構) :

if (recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)}) < 0) {
        perror("recvto()");
        exit(84);
    }

這里的Barmar是Wireshark消息send的輸出:

在此處輸入圖片說明

這是相同功能上的send和recvfrom的代碼:

int len = 0;
    if (sendto(t->sock, t->buffer, t->ip->tot_len, 0,
               (struct sockaddr *)&t->_sin, sizeof(t->_sin)) < 0) {
      perror("sendto()");
      exit(84);
    }
    if ((len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)})) < 0) {
        perror("recvto()");
        exit(84);
    }

緩沖區不是字符串,而是二進制數據,因此不應使用%s打印。

調用recvfrom時,需要獲取緩沖區的長度。 然后使用循環,以%02X格式打印每個字節。

len = recvfrom(t->sock, t->msg_recv, sizeof(t->msg_recv), 0, \
    (struct sockaddr *)&t->_recv, \
    (socklen_t[1]){sizeof(struct sockaddr_in)});
if (len < 0) {
        perror("recvto()");
        exit(84);
}
for (int i = 0; i < len; i ++) {
    printf("%02X ", t->msg_recv[i]);
    if (i % 16 == 15) {
        printf("\n");
    } else if (i % 16 == 7) {
        printf(" ");
    }
}
printf("\n");

暫無
暫無

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

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