2012-03-26 2 views
1

Я разрабатываю сетевое программное обеспечение как часть университетского экзамена. Программное обеспечение почти закончено, но на самом деле я заканчиваю параллельную часть (с fork()). Мне нужно обменять между клиентом и сервером эти два сообщения как рукопожатие. Вот пример: PING: 3506: СКАЧАТЬ ПОНГ: 5605C UDP-сеть, извлечение чисел из сообщения датаграммы

Вот мой способ справиться с этими сообщениями: на стороне клиента, то есть хозяин, который посылает PING: 3506: DOWNLOAD, я написал

int *childLocalPort; 
childLocalPort = malloc(sizeof(int)); 
childLocalPort[0] = (SERV_PORT_OFFSET + getPort(&portArray, &pidArray, &arrayCounter, cpid)); 

char *pingProcedureString; 
pingProcedureString = malloc(30*sizeof(char)); 
strcpy(pingProcedureString, "PING:"); 

char *itoaPortBuffer; 
itoaPortBuffer = malloc(6*sizeof(char)); 
itoa((childLocalPort[0]), itoaPortBuffer, 10); 
strcat(pingProcedureString, itoaPortBuffer); 
strcat(pingProcedureString, ":DOWNLOAD"); 
if (sendto(sockfd, pingProcedureString, strlen(pingProcedureString), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) 
{ 
    perror("errore in sendto1"); 
    exit(1); 
} 
free(itoaPortBuffer); 
free(pingProcedureString); 



n = recvfrom(sockfd, buff, MAXLINE, 0, NULL, NULL); 
buff[n] = 0; 
if(strcmp(buff,"PONG")) 
{ 
    int *childRemotePort; 
    childRemotePort = malloc(sizeof(int)); 
    strtok(buff, ":"); 
    childRemotePort[0] = ntohs(strtok(NULL, ":")); 

    printf("Remote port is %d\n", childRemotePort[0]); 



    close(pipeLocalPort[0]);   /* Close unused read end */ 
    write(pipeLocalPort[1], childLocalPort, sizeof(int) 
    close(pipeLocalPort[1]);   /* Reader will see EOF */ 
    close(pipeRemotePort[0]); 
    write(pipeRemotePort[1], childRemotePort, sizeof(int)); 
    close(pipeRemotePort[1]); 
} 

на стороне сервера, то есть хозяин, который посылает Pong: 5605, я написал

if ((n > 0) && strcmp(recvline,"PING")) 
{ 
    int *childRemotePort; 
    childRemotePort = malloc(sizeof(int)); 
    strtok(recvline, ":"); 
    char *buffTemp; 
    buffTemp = calloc(5, sizeof(char)); 
    strcpy(buffTemp,strtok(NULL, ":")); 
    childRemotePort[0] = ntohs(atoi(buffTemp)); 
    strtok(recvline, ":"); 
    printf("Remote child client port is: %d\n", childRemotePort[0]); 
} 

Как вы можете заметить, то пОНГ часть отсутствует, потому что я хотел бы сосредоточиться на первом неработающего ра к.т.. Сервер получает правильно (как видно из Wireshark) сообщение PING: 3506: DOWNLOAD, но он говорит мне, что он получил 19476 вместо 3506, и это не так. Я также заметил, что если я попытаюсь отправить числовые сообщения, не преобразовывая их в порядок сетевых байтов, все будет еще хуже. Я борюсь с этим много дней, и я больше не знаю, о чем думать.

+0

1) Ваши буферы слишком малы. 2) Не нужно выделять их с помощью malloc(), вы можете легко выделить в стек несколько буферов размером в несколько сотен байт. 3) вы предполагаете, что сетевые пакеты nul-terminated. Они не. 4) oops, я забыл 'buff [n] = 0; '... – wildplasser

ответ

1

Когда вы отправляете PING с клиента, клиент не может выполнить ntohs на целочисленном порту перед конвертированием в ascii, но при получении на сервере вы делаете ntohs, я думаю, что это вызывает ошибку. Выполнение чего-то в этих строках на стороне клиента PING может помочь, однако, это все еще подвержено ошибкам, если конечный сервер отличается от сервера и клиента.

char *itoaPortBuffer; 
itoaPortBuffer = malloc(6*sizeof(char)); 
itoa(ntohs(childLocalPort[0]), itoaPortBuffer, 10); 
strcat(pingProcedureString, itoaPortBuffer); 
strcat(pingProcedureString, ":DOWNLOAD"); 
Смежные вопросы