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

이 새로운 연결이 설정 될 때마다 업데이트 된 값을 보낼 것입니다.

나는 이것을 시도 할 : 함수 tcpServer.send(char *)은 기본적으로 위의 sendData() 같은

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

입니다.

이렇게하는 이유는 다른 곳에서 같은 코드를 사용해야하기 때문에 TCP 서버를 클래스로 만들 수 있기 때문입니다.

포인터를 전달하고 있기 때문에 기본적으로 send()을 호출 할 때와 동일합니다. 포인터도 거기에 전달하기 때문입니다. 값은 계속 업데이트되지만 주소는 변경되지 않으므로 작동해야합니다. 맞는지 알려주세요. 또한 뮤텍스 잠금을 사용하지 않고이 작업을 수행하는 새로운 방법에 대해서도 열려 있습니다.

답변

0

네, 우리 대부분은 전송을 할 방법은, 버퍼 중 하나를 무효 * 또는 문자에 대한 포인터를 전달입니다 *

I는 다음과 같이 코딩합니다 :

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

한 가지 고려해야 할 다른 스레드에서 수정중인 버퍼에 대한 포인터 사용

송신 중간에 버퍼가 변경되고 보낸 데이터가 정확하지 않을 수 있습니다.

하지만 그 상황은 이미 잘 알고 있습니다. 당신이 지시 한대로 뮤텍스를 사용하는 것이 좋습니다.

+0

감사합니다. 네, 뮤텍스 문제는 문제가 될 수 있지만, 특정 바이트가 읽히는 동안 값을 업데이트하는 경우에만 문제가 될 수 있습니다. 어쨌든 가끔 가치가 잘못 되었다면 문제가되지 않습니다. 다시 한번 감사드립니다. –

관련 문제