在QT4下绑定TCP客户端的IP和端口 [bind QTcpSocket HOWTO]

分类: QT开发 |
转自:在QT4下绑定TCP客户端的IP和端口 [bind QTcpSocket HOWTO]
he code is released under the terms of GNU Lesser General Public License version 2.1
Here's the code.
http://common.cnblogs.com/images/copycode.gif[bind QTcpSocket HOWTO]" />
1 #ifndef Q_BOUND_TCP_SOCKET_H
2 #define Q_BOUND_TCP_SOCKET_H
3
4 #include
5
6
30
31 class QBoundTcpSocket : public QTcpSocket
32 {
33 public:
34
66 bool bindAndConnect(const QString &localAddr, quint16 localPort,
67 const QString &serverAddr, quint16 serverPort);
68 };
69
70 #endif
http://common.cnblogs.com/images/copycode.gif[bind QTcpSocket HOWTO]" />
http://common.cnblogs.com/images/copycode.gif[bind QTcpSocket HOWTO]" />
1 #include "QBoundTcpSocket.h"
2
3 #ifdef Q_OS_LINUX
4 #include
5 #endif
6
7 bool QBoundTcpSocket::bindAndConnect(const QString &localAddr, quint16 localPort,
8 const QString &serverAddr, quint16 serverPort)
9 {
10 #ifdef Q_OS_LINUX
11 int sockfd;
12 int result;
13 struct sockaddr_in localSockAddr;
14 struct sockaddr_in serverSockAddr;
15 bzero(&localSockAddr, sizeof(localSockAddr));
16 bzero(&serverSockAddr, sizeof(serverSockAddr));
17
18 // create socket
19 sockfd = socket(AF_INET, SOCK_STREAM, 0);
20 if( sockfd == -1 )
21 {
22 qDebug() << "QBoundTcpSocket: Cannot create socket";
23 return false;
24 }
25
26 // bind
27 localSockAddr.sin_family = AF_INET;
28 localSockAddr.sin_port = htons(localPort);
29 localSockAddr.sin_addr.s_addr = inet_addr(localAddr.toLocal8Bit().data());
30
31 result = bind(sockfd, (struct sockaddr *)&localSockAddr, sizeof(localSockAddr));
32 if( result == -1 )
33 {
34 qDebug() << "QBoundTcpSocket: Cannot bind socket";
35 return false;
36 }
37
38 // connect
39 serverSockAddr.sin_family = AF_INET;
40 serverSockAddr.sin_port = htons(serverPort);
41 serverSockAddr.sin_addr.s_addr = inet_addr(serverAddr.toLocal8Bit().data());
42
43 result = ::connect(sockfd, (struct sockaddr *)&serverSockAddr, sizeof(serverSockAddr));
44 if( result == -1 )
45 {
46 qDebug() << "QBoundTcpSocket: Cannot connect to server";
47 return false;
48 }
49
50 // set socket descriptor
51 if( !setSocketDescriptor(sockfd, QAbstractSocket::ConnectedState))
52 {
53 qDebug() << "QBoundTcpSocket: Cannot set socket descriptor";
54 return false;
55 }
56
57 return true;
58 #else
59 qDebug() << "QBoundTcpSocket for Windows/Mac OS is not implemented yet";
60 return false;
61 #endif
62 }