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