【问题标题】:simple TCP client serve model in C : client not recievingC中的简单TCP客户端服务器模型:客户端不接收
【发布时间】:2011-11-14 00:48:52
【问题描述】:

我在 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 你好

我使用的是 Ubuntu 11.04 和 gcc 编译器。

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

奥马尔

【问题讨论】:

  • recv 是永远阻塞还是返回?如果是后者,请检查 errno,方法是执行 if (int r = recv (s_id, (char *) msg, 9, 0) &lt; 0) {perror("recv");} 之类的操作
  • 在编写新的网络代码时,请尽可能使用 getaddrinfo。

标签: c tcp client recv


【解决方案1】:
char *msg = "hello";

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

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

你正试图写给它。

将您的声明更改为:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    编辑0:

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

    【讨论】:

    • 在我刚刚执行了一个简单的声明之前,即char *msg;,这会给我一个分段错误。之后我也用“hello”初始化了它。那确实消除了分段错误,但我无法收到消息....但现在我可以感谢@Brian Roach
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2016-10-05
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多