gpt4 book ai didi

通过套接字发送后,C 结构未获取填充值

转载 作者:行者123 更新时间:2023-11-30 15:28:11 24 4
gpt4 key购买 nike

我正在尝试通过 TCP 中的套接字发送结构。然而,当我在结构中收到数据时,我得到一个空结构。

这是客户端发送的结构:

typedef struct NwInfo
{
void *pvData;
NwTypes e_recv;
}NwInfo;

struct NwInfo test;
test.e_recv = 1;
test.pvData = (void *) &pst; //pst is object of another structure.

int ret =send(sockfd,&test,sizeof(test),0); //ret returns greater than 0

在服务器端:

 NwInfo *pRecvNwInfo;
pRecvNwInfo = malloc(sizeof(NwInfo));

int nbytes = recv(filedes,pRecvNwInfo,sizeof(NwInfo),0);
//nbytes is the same value as that of ret

struct student *pst;
pst = (struct student *)pRecvNwInfo->pvData;

服务器端的pst变量没有获取任何数据。有人能指出我犯的错误吗?

最佳答案

你的Socket编程没有问题。
你需要看的是逻辑。

这里的服务器和客户端是两个不同的进程,有自己的地址空间。

您的 Socket 编程非常好。例如:

客户端:

send(sockfd, &test, sizeof(test), 0)
printf ("Value of test->e_recv = [%d]\n", test.e_recv);
printf ("Value of test->ptr = [%u]\n", test.ptr);

$ ./client 172.16.7.110 56000
Value of test->e_recv = [1]
Value of test->ptr = [3214048236] // Address of some variable in Client address space.
Data Sent!

服务器将收到完全相同的数据。
服务器端:

NwInfo *pRecvNwInfo = malloc(sizeof(NwInfo));
int nbytes = recv(filedes, pRecvNwInfo, sizeof(NwInfo), 0);
printf("Value of pRecvNwInfo->e_recv = [%d]\n", pRecvNwInfo->e_recv);
printf("Value of pRecvNwInfo->ptr = [%u]\n", pRecvNwInfo->ptr);

$./server 56000
Here is the message.
Value of pRecvNwInfo->e_recv = [1]
Value of pRecvNwInfo->ptr = [3214048236] // Address received correctly, but it is of client address space

所以当你写这个时:

pst = (struct student *)pRecvNwInfo->pvData;

pst 指向地址,该地址仅在客户端地址上下文中有效
因此,访问它(在服务器的上下文中)将为您提供 Undefined Behavior ,就我而言SIGSEGV .

重要说明:
当您send时,您将在test地址中发送数据,当您recv时,您将在某个新容器中接收数据(pRecvNwInfo) 具有不同的地址。

如何纠正此问题:
最好发送值而不是地址。考虑以下结构:

    typedef struct inner
{
int a;
int b;
}inner_t;


typedef struct outer
{
void *ptr;
int c;
}outer_t;
  1. 您可以更改 outer 的结构定义:将 void * 更改为实际数据而不是地址,类似。 inner_t var

    send(sockfd, &test, sizeof(test), 0);
  2. 创建临时结构类型(用于发送和接收)。

    /* Temporary Buffer Declaration */
    typedef struct temp{
    inner_t value_in;
    outer_t value_out;
    } temp_t;

    temp_t to_send;

    inner_t buffer_in;
    /* Save values instead of address */
    memcpy(buffer_in, ptr, sizeof(inner_t));

    to_send.value_in = buffer;
    to_send.value_out = outer;

    /* Send the final structure */
    send(sockfd, &to_send, sizeof(temp_t), 0);

这些可能不是最佳实践,我很想知道是否有更好的实践。

关于通过套接字发送后,C 结构未获取填充值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26709526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com