UDP 소켓에 대해서 질문 하나 드립니다
UDP 통신을 이용하여 클라이언트에서 서버로 데이터(클래스)를 전송하는데는 성공을 하였습니다
그래서 클라이언트에서 1분 간격으로 crontab을 이용해 자동으로 데이터를 전송하도록 하였습니다
서버는 백그라운드로 돌렸습니다.. 그런데 서버가 데이터를 한 30개 정도 받으니 세그멘테이션 오류가 뜨며
백그라운드가 종료되었습니다
서버는이렇게 되어있습니다
sock = socket(AF_INET, SOCK_DGRAM, 0); //소켓함수 호출
if (sock == -1)
{
printf("Socket Error!");
return -1;
}
printf("UDP complete.\n");
sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(9000);
retval = bind(sock, (sockaddr *) &serveraddr, sizeof(serveraddr));
if (retval == -1)
{
printf("Bind Error!");
return -1;
}
printf("Bind Complete.\n");
sockaddr_in clientaddr;
memset(&clientaddr, 0, sizeof(clientaddr));
int addrlen = sizeof(clientaddr);
memset(&clientaddr, 0, sizeof(clientaddr));
while(1)
{
retval = recvfrom(sock, (char*)&test, sizeof(test), 0, (sockaddr *)&clientaddr, (socklen_t*)&addrlen);
if(retval == -1)
{
printf("Recv Error");
return -1;
}
}
지나가다가...
여러개의 user가 접속하나요?? bind와 recv를 서로 다른 thread에서 처리하셔야 할듯...
...
여러개가 접속할때도 이런일이 생겨서 하나의 클라이언트만으로 실행해봐도 똑같은 결과였습니다..ㅠ
디버깅 정보를 활요하시면 도움이
디버깅 정보를 활요하시면 도움이 되실듯합니다.
컴파일시 -g 옵션(디버깅 정보)을 활용하시고
서버가 죽을때 core 파일을 남겼을 겁니다.
없다면 core를 남기게 하시면 됩니다.(ulimit -a으로 조회하여 core항목 확인)
dbx, gdb를 이용하신다면 원인을 빠르게 찾을실수 있을 겁니다.
gdb 바이너리명 core
다른 것은 모르겠고, ... retval =
다른 것은 모르겠고,
test 의 타잎이 뭔지 다시 살펴보세요.
댓글 달기