[英]Recvfrom and Wireshark
我與服務器通信,我用套接字(sock_raw ..)發送消息,它工作正常,客戶端(我),發送消息,服務器接收正確的消息,但是當服務器需要將消息發送給我時(客戶端),則客戶端不會使用recv從中檢索正確的信息。
我在兩個調用server-> client上檢索到此:
buffer = [E] | len_buffer = [2]
buffer = [E] | len_buffer = [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.