套接字上的 select() (问题)
最近我完成了这部分代码。
它确实有效,但 select() 效果不好。
当它收到服务器的最后回复时,它开始重复最后的回复字符串,并在回复字符串的开头添加一些奇怪的字符。 所以看看这个:
:[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
第一个字符串是服务器的最后回复。所以接下来的字符串只是一些垃圾。 我尝试在一些搜索引擎中查找信息,但没有成功。
Recently I have done this part of code.
It does work, but select() works bad.
When it has got last reply from server, it begins repeating last reply string with some strange characters in the beginning of reply string.
So look at this:
:[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
�C���C��[email protected] PRIVMSG testuser1 :VERSION
The first string is the last reply from server. So next strings are just some junk.
I tried to look for information in some search engines, but no luck.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这不是
select
有问题,而是代码中的逻辑有问题(毫不奇怪)。如果
select
因为 stdin 可读而返回,那么您仍然会查看c[0]
(从最后一次服务器读取) - 即使您没有从服务器读取这次,它仍然是\n
,因为您从未重置过它。移动这段代码:
在
else if (rc == 1) {
块内。It's not
select
that has the problem, it's the logic in your code (unsurprisingly).If
select
returns because stdin is readable, then you still look atc[0]
(from the last server read) - and even though you didn't read from the server this time, it's still\n
, because you never reset it.Move this bit of code:
inside the
else if (rc == 1) {
block.