C++ 使用套接字的双向通信
我正在尝试使用套接字实现双向通信,但不太确定哪里出了问题。我有一个启动子应用程序的应用程序,然后子应用程序尝试与启动它的应用程序通信,但我没有得到任何信息 在启动子项的应用程序中:C++ 使用套接字的双向通信,c++,sockets,C++,Sockets,我正在尝试使用套接字实现双向通信,但不太确定哪里出了问题。我有一个启动子应用程序的应用程序,然后子应用程序尝试与启动它的应用程序通信,但我没有得到任何信息 在启动子项的应用程序中: int clsSocketThread::initialiseSocket(bool blnIsModule, QString strPurpose) { const char* cpszLocalHost = "localhost"; //Get the socket i
int clsSocketThread::initialiseSocket(bool blnIsModule, QString strPurpose) {
const char* cpszLocalHost = "localhost";
//Get the socket
int intSocket = socket(AF_INET, SOCK_STREAM, 0);
if ( intSocket == 0 ) {
clsDebugService::exitWhenDebugQueueEmpty("Failed to create socket!");
}
struct hostent* pHostEntry = gethostbyname(cpszLocalHost);
if ( pHostEntry == nullptr ) {
clsDebugService::exitWhenDebugQueueEmpty("Unable to resolve ip address!");
}
//Initliase and get address of localhost
struct sockaddr_in srvAddr;
bzero((char*)&srvAddr, sizeof(srvAddr));
//Set-up server address
memcpy(&srvAddr.sin_addr, pHostEntry->h_addr_list[0], pHostEntry->h_length);
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(clsSocketThread::mscuint16Port);
char* pszIP = inet_ntoa(srvAddr.sin_addr);
if ( pszIP != nullptr ) {
qdbg() << "Setting up socket on ip: " << pszIP
<< ", port: " << clsSocketThread::mscuint16Port
<< ((strPurpose.isEmpty() == true) ? "" : strPurpose);
}
socklen_t tSvrAddr = sizeof(srvAddr);
int intRC;
#if !defined(STANDALONE)
if ( blnIsModule == true ) {
intRC = inet_pton(srvAddr.sin_family, pszIP, &srvAddr.sin_addr);
if ( intRC <= 0 ) {
clsDebugService::exitWhenDebugQueueEmpty("Invalid address not supported!");
}
intRC = ::connect(intSocket, (const struct sockaddr*)&srvAddr, tSvrAddr);
} else
#endif
{
intRC = bind(intSocket, (const struct sockaddr*)&srvAddr, tSvrAddr);
}
if ( intRC < 0 ) {
clsDebugService::exitWhenDebugQueueEmpty("Socket operation failed!");
}
if ( blnIsModule != true && listen(intSocket, 5) < 0 ) {
clsDebugService::exitWhenDebugQueueEmpty("Cannot listen to socket!");
}
return intSocket;
}
int-clsSocketThread::initialiseSocket(bool-blnIsModule,QString-strPurpose){
const char*cpszLocalHost=“localhost”;
//拿插座
int intSocket=socket(AF_INET,SOCK_STREAM,0);
if(intSocket==0){
clsDebugService::exitwendebugqueueempty(“未能创建套接字!”);
}
struct hostent*pHostEntry=gethostbyname(cpszLocalHost);
if(pHostEntry==nullptr){
clsDebugService::exitwendebugqueueempty(“无法解析ip地址!”);
}
//初始化并获取本地主机的地址
srvAddr中的结构sockaddr_;
bzero((char*)&srvAddr,sizeof(srvAddr));
//设置服务器地址
memcpy(&srvAddr.sin_addr,pHostEntry->h_addr_list[0],pHostEntry->h_length);
srvAddr.sin_family=AF_INET;
srvAddr.sin_port=htons(clsSocketThread::mscuint16Port);
char*pszIP=inet\u ntoa(srvAddr.sin\u addr);
if(pszIP!=nullptr){
qdbg()这是特定于操作系统的。
对于Linux,请阅读
,考虑在主线程中使用。
您可能还想使用、、(可能与)或
<> P.C.,PoCo,./P>的C++源代码可以得到一些启发。
请注意,在许多(但不是所有)情况下,发射端的一个或多个可能对应于接收端的多个或多个(反之亦然),至少在不同的机器上使用TCP。因此,您需要一些(通常是周围的…)和有文件记录的应用程序级消息格式约定。然后,或者可能是鼓舞人心的(在某些情况下,它是有用的)。我可能误解了,但是在父母和孩子之间使用管道会更“正常”和更简单。谢谢,你能推荐一些使用Qt套接字的好教程吗?Qt有一个很好的文档,是开源的,有很多例子,例如或
void clsSocketThread::serverSocketBody() {
if ( mintSocket == 0 ) {
mintSocket = clsSocketThread::initialiseSocket();
}
QByteArray qarybytBuffer;
char arycBuffer[2048];
int intNewSocket = 0;
size_t tBufferSize = sizeof(arycBuffer);
QJsonObject objJSON;
while( mpThread != nullptr ) {
if ( intNewSocket <= 0 ) {
struct sockaddr_in cliAddr;
socklen_t tCliLen = sizeof(cliAddr);
intNewSocket = accept(mintSocket, (struct sockaddr*)&cliAddr, &tCliLen);
if ( intNewSocket < 0 ) {
continue;
}
}
//Read from the other socket!
bzero(arycBuffer, tBufferSize);
ssize_t tRead = read(intNewSocket, arycBuffer, tBufferSize);
if ( tRead <= 0 ) {
continue;
}
qarybytBuffer = QByteArray(arycBuffer, (int)tRead);
int intIdx = qarybytBuffer.indexOf(clsJSON::msccOpenCurlyBracket)
,intIdx2 = qarybytBuffer.lastIndexOf(clsJSON::msccCloseCurlyBracket);
if ( intIdx >= 0 && intIdx2 > intIdx ) {
qarybytBuffer = qarybytBuffer.mid(intIdx, intIdx2 - intIdx + 1).trimmed();
QJsonObject objJSON(clsJSON(&qarybytBuffer).toQJsonObject());
if ( objJSON.contains(clsJSON::mscszMsgType) == true ) {
qdbg() << "[RX]Data: " << arycBuffer;//HACK
clsJSON::blnDecodeAccordingToType(&objJSON);
}
}
}
}