TCP/IP分层:
应用层:应用程序及应用协议的集合
传输层:端口的寻址,寻址任务(进程) TCP/UDP
网络层:提供了端对端(寻址机器)的寻址:IP
物理层:提供了上层访问硬件设备的功能:驱动程序
几个概念:
socket:一系列网络编程接口
IP:网络通信中唯一标定一台机器,NAT转换
端口号:选择原则:>5000
TCP/UDP协议:
TCP:有连接,可靠的协议:数据无丢失、无失序、无错误、无重复
UDP:无连接,不可靠
linux socket编程流程(CS架构):
TCP编程流程(打电话)
server端(接听电话的人):
1.socket-----------------有一个电话
2.bind-------------------绑定一个卡,并把号码告诉别人(自己的号)
3.listen-----------------待机,等待别人打电话进来
4.accept-----------------接电话
5.recv/send--------------通话过程
6.close------------------挂机
client端(打电话的人):
1.socket-----------------有一个电话
2.connect----------------拨打电话(指定对方的号码)
3.recv/send--------------通话过程
4.close------------------挂机
UDP编程流程(发短信)
server端(收短信的人):
1.socket-----------------有一个电话
2.bind-------------------绑定一个卡,并把号码告诉别人(自己的号)
3.recvfrom---------------接收短信(会收到对方的号码)
4.sendto-----------------回发短信
5.close------------------关机
client端(发短信的人):
1.socket-----------------有一个电话
2.sendto-----------------发送短信(指定对方号码)
3.recvfrom---------------接收对方短信
4.close------------------关机
Qt网络编程–TCP编程
1.模块引入:项目文件中添加:QT += network
头文件包含: #include 或#include
2.tcp服务器编程流程–QTcpServer、QTcpSocket
实例化QTcpServer对象----------------------------->socket
进入监听状态–listen(QTcpServer) //不需要再绑定了----------->bind + listen
监测客户端连接–newConnection信号(QTcpServer)---------------->有新连接过来,server就能收到newConnection信号
QTcpSocket<–获得连接–nextPendingConnection(QTcpServer)------------------>accept
连接对端接收信号–readyRead(QTcpSocket)---------------------->如果对端有数据发送,server就能收到readyRead信号
读取客户端消息–readAll(QTcpSocket)-------------------------->recv:读取数据
发送数据–write(QTcpSocket)—>send:发数据
关闭连接–disconnectFromHost()------------------->close
3.tcp客户端编程流程–QTcpSocket
实例化QTcpSocket对象
连接服务器–connectToHost—>接着使用waitForConnected来判断是否连接成功
连接对端接收信号–readyRead
发送数据–write()
关闭连接–disconnectFromHost()
涉及到的接口和类:
bool QTcpServer::listen(const QHostAddress & address = QHostAddress::Any, quint16 port = 0)
QHostAddress:对IP地址进行重新封装 QHostAddress(const QString & address)
QHostAddress::Any = 0.0.0.0 表示监听任何地址
QTcpSocket * QTcpServer::nextPendingConnection()
server端调用此方法从连接队列中获取一个等待连接,并得到客户端的连接。
QTcpSocket的方法:
void connectToHost(const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite)
bool waitForConnected(int msecs = 30000)
典型使用代码:
socket->connectToHost(“imap”, 143);
if (socket->waitForConnected(1000))
qDebug(“Connected!”);
4.辅助接口–QAbstractSocket
QHostAddress localAddress() //返回本机地址
QHostAddress peerAddress() //返回对端连接地址
quint16 localPort() const
quint16 peerPort() const
SocketState state() const //返回当前状态
//阻塞等待连接,成功后返回true,超时返回false,用于客户端连接
QAbstractSocket::waitForConnected(int msecs = 30000)
信号:
void connected()
void disconnected()
Qt网络编程–UDP编程
1.模块引入:项目文件中添加:QT += network 头文件包含: #include
2.udp服务器编程流程–QUdpSocket
实例化QUdpSocket对象----------------------------------->socket
绑定地址、端口–bind(QHostAddress::LocalHost, 8888)---->bind
收发报文–readDatagram、writeDatagram------------------>recvfrom/sendto
3.接口:
bool QUdpSocket::hasPendingDatagrams() const
qint64 QUdpSocket::readDatagram(char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0)
qint64 QUdpSocket::writeDatagram(const char * data, qint64 size, const QHostAddress & address, quint16 port)
4.参考QUdpSocket的Detailed Description的案例代码