2013-06-02 3 views
-4

Linux에서 C 프로그래밍을 처음 사용하기 때문에 서버를 만들려고합니다. 나는 accept 메소드를 켰다. 클라이언트가 연결을 시도했지만 아무 일도 일어나지 않았습니다! 나는 이유를 모른다. 나를 도와주고 싶니?내 서버가 왜 동의하지 않습니까?

서버 측 :

int main(int argc, char *argv[]) 
{ 
    int len,err,port; 
    if(argc != 2) { 
     exit(1); 
    } 
    initSem(); 
    port = atoi(argv[1]); 
    initSocket(port); 
    printf("server fd: %d.\n", serverFd); 

    len = sizeof(struct sockaddr_in); 
    printf("len: %d\n",len); 
    clientsFd[counterThread] = accept(serverFd, 
             (struct sockaddr*)&clientsAddress[counterThread], 
             (socklen_t*)&len); 
    printf("new client:: %d", clientsFd[counterThread]); 
    if(clientsFd[counterThread] == -1) { 
     perror("can't connect to new client."); 
     exit(1); 
    } 

    return 0; 
} 

void initSocket(int port) 
{ 
    erverFd = socket(AF_INET, SOCK_STREAM, 0); 

    serverAdrees rees.sin_addr.s_addr = INADDR_ANY; 
    serverAdrees.sin_port = htons(port); 
    bind(serverFd, (struct sockaddr*)&serverAdrees, (socklen_t)sizeof(struct sockaddr_in)); 

    listen(serverFd, MAX_CLIENTS); 
} 

클라이언트 측 :

int main(int argc, char *argv[]) 
{ 
    int err,len,port; 
    struct sockaddr_in serverAddr; 
    char massageBuf[MAX_MASSAGE]; 
    pthread_t readThread; 
    if(argc != 3) { 
     perror("no arguments..\n"); 
     return 1; 
    } 
    if((serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     perror("\n Error : Could not create socket \n"); 
     return 1; 
    } 
    printf("server fd: %d.\n", serverFd); 

    serverAddr.sin_family = AF_INET; 
    port = atoi(argv[2]); 
    serverAddr.sin_port = htons(port); 
    printf("addr: %s .\n", argv[1]); 
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    printf("before connect\n"); 
    if(connect(serverFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) 
    { 
     perror("\n Error : Connect Failed \n"); 
     return 1; 
    } 
    printf("after connect \n"); 
    while (1) { 
     scanf("%s", massageBuf); 
     printf("%s \n", massageBuf); 
     if(-1 == write(serverFd, massageBuf, strlen(massageBuf))) { 
      perror("\n Error : write to server Failed \n"); 
      return 1; 
     } 
     if(!strcmp(massageBuf,"close")) { 
      exit(1); 
      return 0; 
+6

모든 소켓 관련 시스템 호출 (socket, bind, listen, accept, connect)의 결과를 확인해야합니다. 그러면 어느 것이 실패하는지 알 수 있습니다. (아마도'bind '는'ServerAddress' 구조체를 제로로 만들지 않았기 때문에 실패 할 수도 있고 포트가 바쁜 것일 수도 있습니다.) 리눅스에서 계속 프로그래밍을 할 계획이라면 원칙적으로 받아 들여야합니다 : 항상 시스템의 결과를 확인하십시오 또는 어떤 식 으로든 실패 할 수있는 라이브러리 함수 (물론'printf'의 결과를 확인하는 것을 권장하지 않지만 대부분은 검사해야합니다). – Inspired

+4

코드를 들여 쓰기가 가능하도록하십시오. 그런 다음 문제를 나타내는 ** 간단한 코드 **로 줄이십시오. –

답변

1

당신의 클라이언트가 잘 될 질수있는 INADDR_ANY에 연결을 시도합니다. 명령 행 인수로 지정한 주소에 connect()를 호출하십시오.

이외의 코드는 매우 SSCCE이 아니기 때문에 말하기는 어렵습니다. 의견에서 알 수 있듯이 청소 해보십시오. initSem(); 같은 통화를 제거 (또는 코드 표시) accept(), 내 나쁜에 대해과 구조 등 clientsFd[counterThread]

편집 제거 조언을.

+0

INADDR_ANY가 동일한 시스템에서 작동 할 수 있습니다 (telnet 0 22 시도). accept()를 호출합니다. – unbeli

+0

@unbeli 아니오. 'telnet 0 22'는 'telnet 0.0.0.0 22'과 동일하지 않습니다. 둘 다 시도해보십시오. – EJP

+0

@ unbeli 네, 맞습니다. 나는 코드를 보면서 동의를 놓쳤다. 나는 단지 INADDR_ANY라고 말할 것입니다. – thuovila

관련 문제