C++网络编程
Posted
技术标签:
【中文标题】C++网络编程【英文标题】:C++ network programming 【发布时间】:2011-08-12 00:24:57 【问题描述】:嘿,我想扩展我在 C++ 方面的知识,所以我要做的第一件事就是网络编程。
我想制作一个 IRC 机器人(希望它能教我有关套接字编程和网络主题的知识),但我不知道从哪里开始。如果有人能向我解释 IRC 机器人是如何工作的以及如何制作它们,并指导我使用一些学习资源,那就太好了。简单的 sn-ps 也会很棒......
谢谢!
编辑:
忘了说我用的是ubuntu,所以windows方式不行
【问题讨论】:
阅读一本关于套接字和 TCP/IP 的书会是我的最爱。 6 年后,什么对你有用?可以分享一下吗? 【参考方案1】:要了解套接字并正确使用它们,您需要套接字圣经:
W。理查德·史蒂文斯,Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition)
在您坐下来编写一行套接字代码之前,您绝对必须拥有这本书。没有它就不要离开家。真的。在Amazon 使用约 35 美元起。
编辑: OP 询问了其他卷。以下是另外两个:
W. Richard Stevens, UNIX Network Programming, Volume 2: Interprocess Communications (2nd Edition) W.理查德史蒂文斯, TCP/IP Illustrated, Vol. 1: The Protocols
它们具有 Stevens 一贯和预期的卓越品质。我不知道他整合所有这些书籍的计划是什么,
【讨论】:
我使用 linux.. 那本书说 Unix。这会有什么不同吗? @MisterSir - 网络 API 几乎相同。史蒂文斯对你来说是一本很棒的书。 其余的卷呢?它们是否相关? @MisterSir -- 我添加了另外两本书。看一看;它们可能是相关的。 @MisterSir -- 我认为您还应该考虑@ildjarn 推荐的 boost.asio 库。我只是刚刚了解它,但它对我来说看起来非常好。尽管我认为我们每个人都需要了解套接字,但从文档看来 boost.asio 可以为您节省至少几周的编码和测试时间。但是你用过它却不喜欢它:你一定知道一些我不知道的东西。【参考方案2】:boost.asio 是(在我看来)用现代 C++ 编写独立于平台的网络代码的事实标准。
【讨论】:
您认为使用 boost.asio 可以避免学习套接字 API 的需要吗?还是建议大家先写传统的socket程序,再改用boost.asio? @Rob Adams : 就像我认为在原始指针/C 数组和 C 字符串之前应该学习std::vector<>
和 std::string
一样,我认为应该先编写 boost.asio 程序然后之后学习传统的套接字。
我使用了一些 boost 的特性,但我真的不喜欢 boost::asio。或者也许我只是不太了解它。
+1 在看到您的答案之前,我对 boost.asio 一无所知,但看了之后,我认为这确实是让某些东西快速运行的最佳方式。感谢您提供的非常重要且有用的指针。【参考方案3】:
我的建议:
我首先会用编写速度快、功能强大的高级语言(例如 python)来编写机器人。习惯使用网络工具、IRC 协议等。
了解底层的套接字和网络。对于 Unix,我想说看看 Unix Network Programming。
用 C++ 编写您的机器人!犯错误,改正错误,然后坚持下去。
【讨论】:
我真的只懂一点 Python,所以如果你能给我看一些例子,那可能会有所帮助。谢谢 我现在时间真的很紧,但找到你这个:osix.net/modules/article/?id=780希望它有帮助【参考方案4】:到目前为止,学习 C/C++ 套接字编程的最佳指南一定是Beej's Guide to Network Programming。它通过示例和详细说明完成了您需要了解的所有步骤。据我所知,该网站唯一缺少的信息是 IPv6 多播。
【讨论】:
【参考方案5】:从一个简单的客户端-服务器示例开始。使用 Qt 框架非常容易。例如:
server.cpp:
#include <QTcpSocket>
#include <QTcpServer>
int main()
QTcpServer *tcpServer = new QTcpServer(); //creates TCP-based server
tcpServer->listen(QHostAddress("172.16.254.1"),5300); //listen on your IP adress, port 5300
while ( tcpServer->isListening() ) //while server is listening
QTcpSocket* tcpSocket; //define TCP-based socket
tcpServer->waitForNewConnection(); //server waits for connection
if ( (tcpSocket = tcpServer->nextPendingConnection()) ) //if there are connections to be processsed
tcpSocket->write("hello",6); //write "hello" to the socket, client is connected to
tcpSocket->flush();
client.cpp:
#include <QDebug>
#include <QTcpSocket>
int main()
QTcpSocket *tcpSocket = new QTcpSocket(); //create TCP-based socket
tcpSocket->connectToHost("172.16.254.1",5300); //connect socket to server
tcpSocket->waitForConnected(); //wait
tcpSocket->waitForReadyRead();
qDebug() << tcpSocket->readAll();
您需要做的就是在一个终端窗口中运行第一个程序,然后在另一个窗口中运行第二个程序。
你会发现更多Qt网络示例here
【讨论】:
以上是关于C++网络编程的主要内容,如果未能解决你的问题,请参考以下文章