来回发送和接收

时间:2014-04-23 06:24:11

标签: c sockets send recv

我正在尝试实现一个非常简单的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);

客户端相应地工作。 我不能混合recvs和发送?客户端的recv后的发送工作,服务器端的发送后的recv也没有。 我错过了什么? 希望这很清楚。

1 个答案:

答案 0 :(得分:0)

char* buf;

使用此时的Instant 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.之间的任何内容recv()函数不必填充您的缓冲区,接收整个& #39;消息'等