Я разрабатываю приложение, похожее на Telnet для изучения программирования Linux, в C, и я столкнулся с проблемой передачи, когда отправляю два сообщения в взрыве. Это поток с использованием IPv4
Я использовал специальный символ STX '\ 002' и EOT '\ 004', чтобы отделить сообщения друг от друга, поскольку они были «объединены», если они были отправлены сразу после другого . Но программа Иногда не удалось отправить сообщение после символа EOT, в результате чего второе сообщение не было отправлено. Часть после первого сообщения просто «умирает». < /P>
sendMessage(socketFD, "Joined room.");
sendRoomMenu(socketFD);
< /code>
Определения вышеуказанных функций: < /p>
void sendMessage(int socketFD, char * msg){
char buffer[BUFFERSIZE];
buffer[0] = '\0';
formatColor(YELLOW, "[SERVER] ", buffer, BUFFERSIZE);
formatColor(YELLOW, msg, buffer, BUFFERSIZE);
buffer[BUFFERSIZE - 1] = '\0';
if ( socketFD != NULL_SOCKET )
sendToClient(socketFD, buffer);
}
void sendRoomMenu(int socketFD){
char buffer[BUFFERSIZE];
buffer[0] = '\0';
formatColor(PURPLE, "\nRoom commands:\n", buffer, BUFFERSIZE);
formatColor(YELLOW,
"/lobby\n"
"/exit\n",
buffer, BUFFERSIZE
);
sendToClient(socketFD, buffer);
}
char * formatColor(enum colors color, char src[], char dest[], size_t dest_size){
// color_codes is just an array of strings, which are ANSI color codes
strncat(dest, color_codes[color], dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
strncat(dest, src, dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
strncat(dest, color_codes[RESET_COLOR], dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
return dest;
}
< /code>
Это функции, которые готовит немного текста и отправляют его сразу после другого в приведенном выше случае, используя функцию Sendtoclient, которая ниже: < /p>
void sendToClient(int socketFD, char * msg){
char buffer[BUFFERSIZE];
buffer[0] = MSG_START;
buffer[1] = '\0';
strncat(buffer, msg, BUFFERSIZE - strlen(buffer));
buffer[BUFFERSIZE - 1] = '\0';
char * bufferEnd = strchr(buffer, '\0');
*bufferEnd = MSG_END;
ssize_t sendSize;
if ( (sendSize = send(socketFD, buffer, bufferEnd - buffer + 1, 0)) < 0 ){
printf("send error: %s\n", strerror(errno));
printAndExitFailure("");
}
}
< /code>
Как мне решить эту проблему, это побочный продукт протокола сокета, который я использую, который должен быть исправлен с помощью, например, Определенные флаги или это что -то еще?
Спасибо за ваши ответы.>
Подробнее здесь: https://stackoverflow.com/questions/795 ... ansmission
Потерянные данные при передаче гнезда Linux [закрыто] ⇐ Linux
-
Anonymous
1741726815
Anonymous
Я разрабатываю приложение, похожее на Telnet для изучения программирования Linux, в C, и я столкнулся с проблемой передачи, когда отправляю два сообщения в взрыве. Это поток с использованием IPv4
Я использовал специальный символ STX '\ 002' и EOT '\ 004', чтобы отделить сообщения друг от друга, поскольку они были «объединены», если [b] они были отправлены сразу после другого [/b]. Но программа [b] Иногда [/b] не удалось отправить сообщение после символа EOT, в результате чего второе сообщение не было отправлено. Часть после первого сообщения просто «умирает». < /P>
sendMessage(socketFD, "Joined room.");
sendRoomMenu(socketFD);
< /code>
Определения вышеуказанных функций: < /p>
void sendMessage(int socketFD, char * msg){
char buffer[BUFFERSIZE];
buffer[0] = '\0';
formatColor(YELLOW, "[SERVER] ", buffer, BUFFERSIZE);
formatColor(YELLOW, msg, buffer, BUFFERSIZE);
buffer[BUFFERSIZE - 1] = '\0';
if ( socketFD != NULL_SOCKET )
sendToClient(socketFD, buffer);
}
void sendRoomMenu(int socketFD){
char buffer[BUFFERSIZE];
buffer[0] = '\0';
formatColor(PURPLE, "\nRoom commands:\n", buffer, BUFFERSIZE);
formatColor(YELLOW,
"/lobby\n"
"/exit\n",
buffer, BUFFERSIZE
);
sendToClient(socketFD, buffer);
}
char * formatColor(enum colors color, char src[], char dest[], size_t dest_size){
// color_codes is just an array of strings, which are ANSI color codes
strncat(dest, color_codes[color], dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
strncat(dest, src, dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
strncat(dest, color_codes[RESET_COLOR], dest_size - strlen(dest));
dest[dest_size - 1] = '\0';
return dest;
}
< /code>
Это функции, которые готовит немного текста и отправляют его сразу после другого в приведенном выше случае, используя функцию Sendtoclient, которая ниже: < /p>
void sendToClient(int socketFD, char * msg){
char buffer[BUFFERSIZE];
buffer[0] = MSG_START;
buffer[1] = '\0';
strncat(buffer, msg, BUFFERSIZE - strlen(buffer));
buffer[BUFFERSIZE - 1] = '\0';
char * bufferEnd = strchr(buffer, '\0');
*bufferEnd = MSG_END;
ssize_t sendSize;
if ( (sendSize = send(socketFD, buffer, bufferEnd - buffer + 1, 0)) < 0 ){
printf("send error: %s\n", strerror(errno));
printAndExitFailure("");
}
}
< /code>
Как мне решить эту проблему, это побочный продукт протокола сокета, который я использую, который должен быть исправлен с помощью, например, Определенные флаги или это что -то еще?
Спасибо за ваши ответы.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79502045/lost-data-in-linux-socket-transmission[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия