如何防止在 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);
由于您没有告诉我们有关服务器端的任何信息,我们可能只能猜测:
gets(buf)
和 "just pressing enter" 离开 buf
"empty".
send(s,buf,strlen(buf),0);
不发送任何内容,因为 buf
已离开 "empty"。
- 假设它是一个回声服务器"echos"(发送)什么都没有,因为它没有收到任何东西,从客户端发送给它。
rc=recv(s,buf,256,0);
永远等待,因为服务器没有发送任何内容 ("echoed")。
要绕过第 4 步中的阻塞,您可以考虑
使用非阻塞套接字从服务器读取。
这样做会使 recv()
在服务器没有可用的情况下立即失败。
正在调用 select()
以测试套接字是否已准备好读取。
您可以设置超时以防止 select()
阻塞。
注:
- 不要使用
gets()
,因为它允许用户溢出传递的缓冲区,因此不安全。 gets()
不再是标准 C 的一部分。
- 没有 C 脚本。你显示的是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);
由于您没有告诉我们有关服务器端的任何信息,我们可能只能猜测:
gets(buf)
和 "just pressing enter" 离开buf
"empty".send(s,buf,strlen(buf),0);
不发送任何内容,因为buf
已离开 "empty"。- 假设它是一个回声服务器"echos"(发送)什么都没有,因为它没有收到任何东西,从客户端发送给它。
rc=recv(s,buf,256,0);
永远等待,因为服务器没有发送任何内容 ("echoed")。
要绕过第 4 步中的阻塞,您可以考虑
使用非阻塞套接字从服务器读取。
这样做会使
recv()
在服务器没有可用的情况下立即失败。正在调用
select()
以测试套接字是否已准备好读取。您可以设置超时以防止
select()
阻塞。
注:
- 不要使用
gets()
,因为它允许用户溢出传递的缓冲区,因此不安全。gets()
不再是标准 C 的一部分。 - 没有 C 脚本。你显示的是C代码。