Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用套接字的双向通信_C++_Sockets - Fatal编程技术网

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);
            }
        }
    }
}