如何防止在 C 中的 WinSock 上输入空

How to prevent empty input on a WinSock in C

我有一个用 C 编写的 WinSock 客户端脚本,当我在没有任何输入的情况下按回车键时,它会挂断。对不起,我不能告诉你更多,我试图在输入后读取缓冲区,但即使这样也不起作用。那是我的代码:

    printf("\ninput [max 256]: ");
    gets(buf);
    send(s,buf,strlen(buf),0);
    rc=recv(s,buf,256,0);
    if(rc==0)
    {
      printf("Server hat die Verbindung getrennt..\n");
      break; // also tried without
    }
    if(rc==SOCKET_ERROR)
    {
      printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
      break; // also tried without
    }
    buf[rc]='[=10=]';
    printf("output: %s\n",buf);

由于您没有告诉我们有关服务器端的任何信息,我们可能只能猜测:

  1. gets(buf) 和 "just pressing enter" 离开 buf "empty".
  2. send(s,buf,strlen(buf),0); 不发送任何内容,因为 buf 已离开 "empty"。
  3. 假设它是一个回声服务器"echos"(发送)什么都没有,因为它没有收到任何东西,从客户端发送给它。
  4. rc=recv(s,buf,256,0); 永远等待,因为服务器没有发送任何内容 ("echoed")。

要绕过第 4 步中的阻塞,您可以考虑

  • 使用非阻塞套接字从服务器读取。

    这样做会使 recv() 在服务器没有可用的情况下立即失败。

  • 正在调用 select() 以测试套接字是否已准备好读取。

    您可以设置超时以防止 select() 阻塞。


注:

  • 不要使用 gets(),因为它允许用户溢出传递的缓冲区,因此不安全。 gets() 不再是标准 C 的一部分。
  • 没有 C 脚本。你显示的是C代码。