0

TCP サーバーを使用して char 配列を送信しています。この関数send()は を受け取りますがchar *、その前に、接続をリッスンして受け入れる必要があります。そのため、着信接続が受け入れられたときに最新のデータを送信したいと考えています。以前は、2 つのスレッドを使用していました。1 つはバッファ内の値を更新し、もう 1 つは単に接続を待ってからデータを送信しました。

ミューテックスをロックしないと問題が発生する可能性があることは理解していますが、それとは別に、をchar *グローバル変数として更新するのではなく、送信関数に渡した場合、この同じスキームは機能しますか?

デモ用のコード:

#include <pthread.h>

char buf[BUFLEN];

void *updateBuffer(void *arg) {
    while(true) {
        getNewData(buf);
    }
}

void *sendData(void *arg) {
    //Setup socket
    while(true) {
        newfd = accept(sockfd, (struct sockaddr *)&their_addr, &size);
        send(newfd, buf, BUFLEN, 0);
        close(newfd);
    }
}

これにより、新しい接続が確立されるたびに更新された値が送信されます。

これを試してみたい:

#include <pthread.h>

char buf[BUFLEN];

void *updateBuffer(void *arg) {
    while(true) {
        getNewData(buf);
    }
}

void *sendData(void *arg) {
    TCPServer tcpServer;
    while(true) {
        tcpServer.send(buf);
   }
}

機能tcpServer.send(char *)は基本的に上記と同じsendData()です。

これを行う理由は、TCP サーバーをクラスにできるようにするためです。別の場所で同じコードを使用する必要があるからです。

私の理解では、ポインターを渡しているので、send()そこにもポインターを渡すので、基本的に を呼び出すだけの場合と同じです。値は引き続き更新されますが、アドレスは変更されないため、機能するはずです。それが正しいかどうか教えてください。私はこれを行う新しい方法にもオープンです(できればミューテックスロックなしで)。

4

1 に答える 1

0

はい、それは私たちのほとんどが送信を行う方法であり、void * または char * のいずれかでバッファーへのポインターを渡します。

私は次のようにコーディングします:

int sendData(const char * buffer, const int length) 
{
    Socket newfd;
    Int NumOfConnects=0;

    while ((newfd=accept(sockfd, (struct sockaddr *)&their_addr, &size)) > 0)
    {
           // It would be necessary here to lock the buffer with a Mutex
            send(newfd, buffer, length, 0);
           // Release the Mutex
            close(newfd);
            NumOfConnects++;
    }

    // there is an error in the accept
    // this could be OK, 
    // if the main thread has closed the sockfd socket indicating us to quit.

    // returns the number of transfers we have done.
    return NumOfConnects;
}

別のスレッドで変更されているバッファーへのポインターを使用する場合に考慮すべき点が 1 つあります。

送信の途中でバッファが変更され、送信されたデータが正確ではない可能性があります。

しかし、その状況もあなたがすでに気づいています。あなたが示したように、ミューテックスを使用することをお勧めします。

于 2013-07-24T11:31:39.167 に答える