2014-04-23 3 views
-1

나는이 작업을 수행해야하는 매우 간단한 TCP 서버/클라이언트를 구현하기 위해 노력하고있어 포트 C에서 수신 : "안녕하세요, 암호를 입력"보내 C : S를 연결 : 메시지를 받고, 암호를 전송합니다. S : 클라이언트의 옳고 그른 암호의 경우 "right"또는 "wrong"로 대답합니다.보내고 recv를 앞뒤로

분명히하는 것이 좋겠습니다.

어떻게 C에서이 작업을 수행 할 수 있습니까? Beej 's Guide를 소켓 프로그래밍에 사용하고 코드를 약간 변경했습니다. 서버 :

i = send(new_fd, "Hello, world!", 13, 0); 
printf("send returned %d\n", i); 

char* buf; 
recv(new_fd, buf, MAX_BUF_SIZE - 1, 0); 
buf[MAX_BUF_SIZE] = '\0'; 
if (!strncmp(buf, "lol", 3)) //the pw is lol 
{ 
    send(new_fd, "right", 11, 0); 
    printf("logged in\n"); 
} 
else 
{ 
    // ...as above... 
} 
close(new_fd); 

클라이언트는 그에 따라 작동합니다. recv 및 보내기를 혼합 할 수 없습니까? 클라이언트 쪽에서 recv 후에도 보내지 않으며 서버 쪽에서 보내기 후에 recv도 작동하지 않습니다. 내가 무엇이 누락 되었습니까? 희망 사항이 충분합니다.

+0

어떤 방식으로 작동하지 않습니까? 'buf'가 유효하지 않은 포인터이기 때문에 여러분이 올린 코드는'recv' 호출에 도달 할 때 충돌하는 것처럼 보입니다. – user3553031

+0

아. 너는 완전히 옳다. 나는 적당한 크기를주지 않았다. 그게 당신이 의미하는 바가 잘못된 것 같네요, 그렇죠? 어쨌든, 지금은 잘 작동합니다. 고맙습니다. – jjstcool

+0

나는 무엇이 작동하지 않는지 알지 못한다. 조금은 명확하게해라.하지만 몇 가지 조언을 해줄 것이다. buf = (char *) malloc (sizeof char) * MAX_BUF_SIZE); 그 후 버퍼 내부의 데이터를 신뢰하지 말고 send와 recv 전에 memclear를 사용하십시오. – Izuel

답변

0
char* buf; 

인스턴트 SIGSEGV를 사용할 때. 확인이 그런

char buf[MAX_BUF_SIZE]; 

: 당신은 count,이 긍정적 인 경우, 1MAX_BUF_SIZE-1.recv() 기능 사이의 것이 될 수 있음을 recv().

int count = recv(new_fd, buf, MAX_BUF_SIZE - 1, 0); 
if (count == 0) 
{ 
    // peer has closed the connection 
    close(new_fd); 
    return; 
} 
if (count == -1) 
{ 
    // I/O error 
    perror("recv"); 
    close(new_fd); 
    return; 
} 
// All good: you received 'count' bytes 
buf[count] = '\0'; 

주에 의해 반환 된 값을 무시하고

recv(new_fd, buf, MAX_BUF_SIZE - 1, 0); 
buf[MAX_BUF_SIZE] = '\0'; 

버퍼를 채우거나 전체 '메시지'를받을 의무가 없습니다.

+0

예, 지금 고쳐졌습니다. 이것은 내 char 포인터에 공간을 할당하지 않는 문제였습니다. 간단히하기 위해 나는 위의 코드를 체크 아웃했다. 나는 그 자신의 코드에서 그렇게한다. 지금은 잘 작동합니다. 감사. 그러나 세그 폴트가 없었습니다. 왜 내 프로그램이 세분화되지 않았을까? OS가 프로세스를 제공하는 메모리 공간을 남겨 두지 않았기 때문에? – jjstcool

관련 문제