C 来回发送和接收

C 来回发送和接收,c,sockets,send,recv,C,Sockets,Send,Recv,我正在尝试实现一个非常简单的tcp服务器/客户机,该服务器/客户机应实现以下功能: S:监听端口 C:连接 S:发送“你好,键入密码” 获取消息,发送密码 S:如果客户端密码正确/错误,则回答“正确”或“错误” 我希望这是清楚的 在C语言中我该怎么做?我使用了Beej的sockets编程指南,只是更改了 编码一点。服务器: i = send(new_fd, "Hello, world!", 13, 0); printf("send returned %d\n", i); char* buf;

我正在尝试实现一个非常简单的tcp服务器/客户机,该服务器/客户机应实现以下功能: S:监听端口 C:连接 S:发送“你好,键入密码” 获取消息,发送密码 S:如果客户端密码正确/错误,则回答“正确”或“错误”

我希望这是清楚的

在C语言中我该怎么做?我使用了Beej的sockets编程指南,只是更改了 编码一点。服务器:

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后发送都不起作用。 我错过了什么? 希望这足够清楚

char* buf;
当你使用这个的时候,即时的SIGSEGV。成功

char buf[MAX_BUF_SIZE];
然后:

您正在忽略由
recv()返回的值。


请注意,
count,
如果为正,则可能是介于
1
MAX\u BUF\u SIZE-1之间的任何值。
recv()函数不必填充缓冲区,也不必接收整个“消息”,等等。

以何种方式不起作用?您发布的代码在到达
recv
调用时看起来会崩溃,因为
buf
是无效指针。Ahhh。你完全正确。我没有给它一个合适的尺寸。这就是你所说的无效,对吗?不管怎么说,现在很好用。非常感谢。我不知道什么不起作用,请说清楚一点,但我会给你一些建议,首先你应该为你的buf保留内存,比如buf=(char*)malloc(sizeof(char)*MAX\u buf\u SIZE);之后,不要信任缓冲区内的数据,在发送和发送之前使用memclearrecv@izuel不需要清除缓冲区。这完全是浪费时间。你只需要知道你实际收到了多少数据。是的,我现在修复了它,问题是没有为我的字符指针分配空间。为了简单起见,我没有签出上面的代码。我用自己的代码来做。现在很好用。谢谢然而,不存在断层。为什么我的程序不会出错?因为我没有留下操作系统给我的内存空间?
recv(new_fd, buf, MAX_BUF_SIZE - 1, 0);
buf[MAX_BUF_SIZE] = '\0';
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';