c - 套接字上的 select() (问题)

标签 c sockets flooding select-function

最近我做了this代码的一部分。

它确实有效,但 select() 效果不好。
当它收到服务器的最后回复时,它开始重复最后的回复字符串,并在回复字符串的开头添加一些奇怪的字符。 那么看看这个:

:nacbot!monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION
�C���C��monitor@nac.bot PRIVMSG testuser1 :VERSION

第一个字符串是服务器的最后回复。所以接下来的字符串只是一些垃圾。 我尝试在一些搜索引擎中查找信息,但没有成功。

最佳答案

这不是 select 有问题,而是代码中的逻辑有问题(毫不奇怪)。

如果 select 由于 stdin 可读而返回,那么您仍然会查看 c[0] (来自上次服务器读取) - 即使您没有读取这次从服务器来看,它仍然是 \n,因为您从未重置它。

移动这段代码:

    if (c[0] == '\n' || c[0] == '\0') {                                        
        buf[--buflen] = '\0';                                                  
        handleMessage(buf, buflen);  /* Just print message */
        buf_do_clean = 1;                                                      
    }                                                                          

else if (rc == 1) { block 内。

关于c - 套接字上的 select() (问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859093/

相关文章:

c - 这是怎么编译的

c - 在 C 中通过套接字传递结构

BufferedReader 上的 Java 客户端套接字阻塞?

c++ - 洪水填充C++

c - 从C中的多个文件中读取内容

c - 如何在保持纹理坐标正确的同时使用 glDrawElements?

java - 我可以设置默认的全局 Java 套接字超时吗?

c++ - readv(), writev(), WSARecv(), WSASend()

security - 如何检查我的 Web 应用程序的用户是否尝试使用不同的凭据登录?

java - 防止 Java/AMF 应用程序中的洪水/DOS 攻击