从recvfrom()缓冲区访问值

时间:2014-05-16 02:34:19

标签: c linux void void-pointers recvfrom

我遇到以下问题。特别是,我试图从传递给recvfrom()方法的缓冲区参数中提取uint32_t和char *。此时,可以使用以下代码正确提取整数:

recvfrom(s, buf, buffer_size, 0, (struct sockaddr*)&si_other, &slen);

uint32_t recv_int = ntohl(*(int*)buf);

char* recv_char = (char*)malloc(6); // NOTE: The original string was "Hello", which has 6 bytes.
strcpy(recv_char, ((char*)buf + sizeof(uint32_t)));

printf("The returned values are %d %s\n", recv_int, recv_char);

但是,当我执行如上所示的printf时,只有recv_int有一个值。 recv_char是一个空字符串。但是,我最初在缓冲区中存储了“Hello”,因此,“Hello”应该打印到stdout。

编辑:

这是在sendto()中使用的代码:

uint32_t my_int = 3;
char* sendString = "Hello";
char* buffer = (char*)malloc(strlen(sendString) + sizeof(int));
memcpy(buffer, &my_int, sizeof(int));
strcpy((char*)buffer + sizeof(int), sendString);

if (sendto(s, buffer, sizeof(int) + strlen(sendString), 0, (struct sockaddr*)&si_other, slen) == -1)
{
    printf("Issue with send\n");
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要将发送缓冲区增大一个字节,以便考虑char字符串的0终止。

char* buffer = (char*)malloc(strlen(sendString) + 1 + sizeof(int));