2012-04-09 7 views
0

건물 서버와 클라이언트 프로그램을 구축 중입니다. 나는 그들이 소켓을 통해 통신하도록 노력하고있다. (32 비트 OS 리눅스에서 쓰고 클라이언트와 서버가 같은 시스템에서 실행되는 것이 중요하다면). 지금, 나는 다음 구조체가 :소켓을 통해 구조체를 보내고 해당 구조체에 액세스 할 때 segfaulting

struct config configData; // global 

을 followes 나는 보낼를 configdata가 정의

struct config_line { 
    char name[MAX_WORD]; //1 byte 
    int time;    //4 bytes 
}; 

struct config { 
    struct config_line *lines; // 4 bytes, points to a struct of 8 bytes 
    int count;     // 4 bytes 
}; 

을 그를 configdata이 같은 :

send (clients [scn], &configData, sizeof (configData), 0) 

이제 내 클라이언트 프로그램, 내부 때 액세스를 시도하십시오

configData.lines[configIndex].name 

그 줄에 segfaults. 누구나 이유가 무엇입니까? 이 유형 config를 보낼 때

+0

recv (s, & configData, sizeof (configData), 0); –

답변

1

, 그것은 포인터 config_line를위한 공간이 있지만 (나는 가정) 배열의 데이터를 동적 곳 포인터 포인트에 할당이 포함되어 있지 않습니다.

그런 다음 클라이언트는 config 유형을 갖지만 배열이 전송되지 않고 포인터가 해당 배열로 설정되지 않아 클라이언트에서 유효하지 않은 포인터 값을 갖습니다. (포인터는 보낸 사람에게 유효하지만 클라이언트에서는 사용하지 않습니다. 별도의 메모리 공간을 사용합니다.)

config에 고정 크기 배열을 지정해야합니다.이 배열에는 원하는 최대 요소 수를 포함 할 수 있습니다 (동적 배열의 내용을 보내고 클라이언트 측에서 구문 분석하여 config 포인터를 해당 배열에 설정하면 참조가 유효 함)

관련 문제