0

我在 c 中制作了一个简单的 TCP 客户端-服务器,并尝试将消息从客户端发送到服务器,但我遇到了一些问题。服务器确实发送了消息(整数值> 0)但客户端无法接收它(整数值> 0)这里是代码:客户端

#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>




int main()
{
    int s_id;
    char *msg = "hello";
    struct sockaddr_in serv_addr;
    s_id = socket (AF_INET, SOCK_STREAM, 0);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons (1156);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(s_id,(struct sockaddr *) &serv_addr, sizeof (struct sockaddr));
    int r = recv (s_id, (char *) msg, 9, 0);
    printf("%d \n", r );
    printf("%s \n", msg );

    return 0;
}

服务器:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int main()
{
       int s_id;
       char *msg = "connected";
       struct sockaddr_in my_addr, remote_addr;
       s_id = socket (PF_INET,SOCK_STREAM,0);
       my_addr.sin_family = AF_INET;
       my_addr.sin_port = htons(1156);
       my_addr.sin_addr.s_addr  = inet_addr("127.0.0.1");

       bind(s_id,(struct sockaddr *) &my_addr, sizeof(struct sockaddr));
       listen (s_id,5);
       int size = sizeof (struct sockaddr_in);
       int new_sd = accept (s_id, (struct sockaddr *) &remote_addr, &size);
       int s= send(new_sd, (void *)msg, 9, 0);
       printf("%d \n", s );
       return 0;
}

我得到的输出(首先启动服务器,然后是客户端)是服务器端:9 客户端:-1 hello

我正在使用 Ubuntu 11.04 和 gcc 编译器。

我希望有人可以提供帮助。谢谢

奥马尔

4

2 回答 2

2
char *msg = "hello";

这是一个字符串文字。这是一个常数,你无法改变它。

int r = recv (s_id, (char *) msg, 9, 0);

在那里你试图写信给它。

将您的声明更改为:

char msg[20];
memset(msg, 0, sizeof(msg));

如果您进行更改,您的代码将按预期工作。

在 C 中,您将不得不分配和管理缓冲区 - 没有免费的午餐 :)

还要注意Nikolai N Fetissov的另一个答案——你真的应该检查所有系统调用的返回码。

于 2011-09-09T18:58:15.833 回答
1

您永远不会在任何系统调用之后检查错误。所有socket(2),connect(2)等都-1在失败时返回,然后您可以使用perror(3)函数打印错误描述。每个系统调用手册页都列出了可能的错误。

编辑0:

真正的问题可能是布赖恩指出的——您正试图将数据接收到客户端的只读内存中。它会因段错误而死吗?

于 2011-09-09T18:57:25.557 回答