无法使用套接字写入流

时间:2011-04-24 10:05:13

标签: c

我对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));
}

我不确定如何继续。我知道如果我只是在客户端回写收到的消息它工作正常,那么每个字符的内存量有问题吗?

3 个答案:

答案 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)); 
在所有读写的情况下

您可能需要查看those examples

答案 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指针的大小。