我正在使用TCP服务器发送char数组。函数send()
需要char *
,但在此之前,它必须侦听并接受连接。鉴于此,我想在接受传入连接时发送最新数据。以前,我使用了两个线程。一个更新缓冲区中的值,另一个只是等待连接,然后发送数据。
我知道没有锁定互斥锁可能存在问题,但除此之外,如果我将char *
传递给send函数,而不是将其更新为全局变量,那么同样的方案是否有效? / p>
要演示的一些代码:
#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()
时相同,因为我也在那里传递指针。该值将继续更新,但地址不会更改,因此它应该可以工作。如果这是正确的,请告诉我。我也愿意采用新方法(最好没有互斥锁)。
答案 0 :(得分: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;
}
要考虑使用指向另一个线程中修改的缓冲区的一件事;
可能是在发送过程中缓冲区发生变化且发送的数据不准确。
但是你已经注意到了这种情况。如您所示,建议使用互斥锁。