我对C很陌生,并且在使用套接字写入流时遇到了麻烦。
我正在使用网络流/套接字尝试在两个方向上发送消息(从主机到客户端和客户端到主机)但是当我从客户端收到消息时它被扰乱(由于编码问题,我猜?)。
以下是我的代码的相关部分:
host.c
int client_sock_fd;
int main(int argc, const char* argv[]) {
while (1) {
char input[80];
scanf("%s", input);
// send to client, transmitted fine
write(client_sock_fd, &input, sizeof(input));
char response[80];
read(client_sock_fd, &response, sizeof(response));
// Prints the missing character symbol, and 'random' letters
printf("Response: %s\n", response);
}
}
client.c
int host_sock_fd; // file descriptor for host
void writeResponse(
int main(int argc, const char* argv[]) {
while (1) {
char message[80];
// the message is transmitted fine
read(host_sock_fd, &message, sizeof(message));
writeResponse("Response message");
}
}
void writeResponse(char response[80]) {
write(host_sock_fd, &response, sizeof(response));
}
我不确定如何继续。我知道如果我只是在客户端回写收到的消息它工作正常,那么每个字符的内存量有问题吗?
答案 0 :(得分:2)
首先,我可以看到您忽略了 write(2)
和 read(2)
的返回代码。请注意,使用这些呼叫时,无法保证与实际发送/接收的八位字节数有关。
如果广告功能返回 发生错误代码 困难,你要检查 那个代码,是的,即使是检查 你的代码大小的三倍 你的打字手指会产生疼痛, 因为如果你瘦了“它不能 发生在我身上,众神肯定会 因你的傲慢而惩罚你。
您应该检查返回的size_t
并继续阅读EOF
(返回0说read(2)
)。
答案 1 :(得分:2)
我在下面显示了缺乏知识,我不会删除它,但这是导致writeResponse(char response[80])
问题的原因,因为response
被视为char *
而不是char[80]
。但一般情况下,不要在不需要时使用&
,它会导致错误,就像你所拥有的那样。将char[]
视为char *
,其中涉及引用级别,这两者之间存在差异,但在这种情况下则不然。
奇怪的是它完全有效,因为你将缓冲区声明为 char input[80];
等,这些变量已经是char指针,你不应该将它们的地址作为参数传递给读/写函数,所以它应该是:
write(client_sock_fd, input, sizeof(input));
而不是:
write(client_sock_fd, &input, sizeof(input));
在所有读写的情况下
答案 2 :(得分:1)
除了MByDs答案之外,你还将一个17个字符的字符串(包括\ 0)传递给writeResponse
函数,然后声称它实际上是 80 4。
更好:
void writeResponse(const char* response) {
write(host_sock_fd, response, strlen(response) + 1);
}
更新:也会进入阵列陷阱。注意
void foo(char *bar)
和
void foo(char bar[80])
是等价的,sizeof(bar)
将在两种情况下返回char指针的大小。