0

我正在使用 TCP 服务器发送一个字符数组。该函数send()需要一个char *,但在此之前,它必须侦听并接受一个连接。鉴于此,我想在接受传入连接时发送最新数据。以前,我使用了两个线程。一个更新缓冲区中的值,另一个只是等待连接,然后发送数据。

我知道不锁定互斥锁可能会出现问题,但除此之外,如果我将它传递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;
}

关于使用指向在另一个线程中修改的缓冲区的指针需要考虑的一件事;

可能是在发送过程中缓冲区发生变化并且发送的数据不准确。

但是你也已经注意到了这种情况。如您所示,建议使用互斥锁。

于 2013-07-24T11:31:39.167 回答