来自socket recv()的memcpy到uint16_t的段错误

时间:2014-09-11 13:54:24

标签: c sockets char memcpy

我通过C套接字发送uint8_t后跟uint16_t,但由于某种原因,当我尝试从char缓冲区复制数据时,我不断收到段错误。

// sending code:
uint8_t a_t = A;
uint16_t b = htons(B);

int len = sizeof(uint8_t) + sizeof(uint16_t); // should be 3 bytes
char buf[3];
memcpy(&buf, &cmd_t, sizeof cmd_t);
size_t offset = sizeof(uint8_t);
memcpy(&buf[offset], &cmd, sizeof cmd); // this works
send(sockfd, buf, len, 0);

// receiving code:

char buf[256];    
int nbytes = recv(sockfd, buf, sizeof(buf), 0);
if (nbytes >0 ){
handleData(buf, nbytes); // buf = "\0\0-100/156"
}



 void handleData(char *buf, int nbytes) {
// buf = "" ????
    uint8_t a;
    uint16_t b;
    memcpy(&a, buf, sizeof(uint8_t));
    memcpy(&b, buf[1], sizeof(uint16_t)); // <-- Segfaults here
    int B = ntohs(b); // convert b to actual number
    }

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

memcpy(&b, buf[1], sizeof(uint16_t)); // <-- Segfaults here

这是因为buf[1]char,而memcpy需要一个连贯的地址(从buf[1]读取会给你带来垃圾)。
正如@joop在评论中所说,你应该宁愿:

memcpy(&b, buf+1, sizeof(uint16_t));

或:

memcpy(&b, &buf[1], sizeof(uint16_t));

在这里,您向memcpy提供buf的地址,其偏移量为1