2013-07-24 2 views
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(), так как я также передаю указатель там. Значение будет продолжать обновляться, но адрес не изменится, поэтому он должен работать. Пожалуйста, дайте мне знать, если это правильно. Я также открыт для новых способов сделать это (без блокировок мьютексов, желательно).

ответ

0

Да, это так, как большинство из нас посыла, передать указатель на буфер, либо аннулируются * или полукокса *

Я бы закодированы так:

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

Одна вещь, чтобы рассмотреть об использовании указателя на буфер, который изменяется в другом потоке;

Может быть, что в середине отправки изменения буфера и отправленные данные не точны.

Но эта ситуация вы уже заметили. Использование Mutex предлагается, как вы указали.

+0

Спасибо! Да, проблема с мьютексом может быть проблемой, но только если конкретный байт обновляет свое значение во время чтения. В любом случае, это нормально, если случайное значение неверно. Еще раз спасибо. –

Смежные вопросы