【问题标题】:send and recv back and forth来回发送和接收
【发布时间】:2014-06-07 19:40:58
【问题描述】:

我正在尝试实现一个非常简单的 tcp 服务器/客户端,它应该这样做: S:监听端口 C:连接 S:发送“你好,输入密码” C:获取消息,发送密码 S:在客户密码正确/错误的情况下回答“正确”或“错误”。

我希望这很清楚。

我将如何在 C 中做到这一点?我使用了 Beej 的套接字编程指南,只是更改了 代码一点。服务器:

i = send(new_fd, "Hello, world!", 13, 0);
printf("send returned %d\n", i);

char* buf;
recv(new_fd, buf, MAX_BUF_SIZE - 1, 0);
buf[MAX_BUF_SIZE] = '\0';
if (!strncmp(buf, "lol", 3)) //the pw is lol
{
   send(new_fd, "right", 11, 0); 
   printf("logged in\n");
}
else
{
   // ...as above...
}
close(new_fd);

客户端相应地工作。 我不能混合接收和发送吗?客户端recv之后的发送都不起作用,服务器端发送之后的recv也不起作用。 我错过了什么? 希望这已经足够清楚了。

【问题讨论】:

  • 在什么情况下不起作用?您发布的代码在调用recv 时看起来会崩溃,因为buf 是无效指针。
  • 啊。你完全正确。我没有给它合适的尺寸。这就是你说的无效,对吧?无论如何,现在工作正常。非常感谢。
  • 我不知道什么是行不通的,说清楚一点,但我会给你几个建议,首先你应该为你的 buf 保留内存,比如 buf = ( char*) malloc (sizeof(char)*MAX_BUF_SIZE);之后,不要信任缓冲区内的数据,并在发送和接收之前使用 memclear
  • @izuel 不需要清除缓冲区。这完全是浪费时间。您只需要知道您实际收到了多少数据。

标签: c sockets send recv


【解决方案1】:
char* buf;

当你使用它时即时 SIGSEGV。实现它

char buf[MAX_BUF_SIZE];

然后:

recv(new_fd, buf, MAX_BUF_SIZE - 1, 0);
buf[MAX_BUF_SIZE] = '\0';

你忽略了recv().返回的值

int count = recv(new_fd, buf, MAX_BUF_SIZE - 1, 0);
if (count == 0)
{
    // peer has closed the connection
    close(new_fd);
    return;
}
if (count == -1)
{
    // I/O error
    perror("recv");
    close(new_fd);
    return;
}
// All good: you received 'count' bytes
buf[count] = '\0';

请注意,count, 如果为正值,则可能介于 1MAX_BUF_SIZE-1. 之间

【讨论】:

  • 是的,我现在修好了,这是没有为我的 char 指针分配空间的问题。为了简单起见,我离开了我上面的代码的检查。我在我自己的代码上这样做。它现在工作正常。谢谢。但是,没有段错误。为什么我的程序不会出现段错误?因为我没有留下操作系统给进程的内存空间?
猜你喜欢
  • 2013-08-13
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多