В настоящее время я пишу игру для iPhone, которая связывается с сервером C++ через TCP/IP для обмена пользовательскими данными, списками друзей, звуковыми файлами и т. Д. Сервер и клиент используют одни и те же структуры при чтении/записи на сокете:Сетевое приложение работает в симуляторе, но не на iPhone.
//Packet used for small stuff
typedef struct small_packet {
int msgtype:8;
int size:16;
int extra:16;
int following:24;
char data1[64];
char data2[64];
} packet;
//Packet used for files
typedef struct file_packet {
int msgtype:8; //For partial file packet this should be 0x02
int size:16;
int extra:16;
int following:24;
char data1[64];
char fileBuffer[1024];
} filePacket;
//Used for file headers
typedef struct filehead_packet {
int msgtype:8;
int size:16;
int extra:16;
int following:24;
char data1[64];
int fileid;
char rest[60];
} fileheadPacket;
Когда в режиме симулятора, приложение отлично работает и общается с сервером через Интернет. Однако при запуске на iPhone это не работает. Пакет входа использует небольшой пакет (верхняя структура). Msgtype равен 0x01, размер sizeof (пакет), следующий - 0, extra - 0, data1 содержит имя пользователя, а data2 - значение вычисленного пароля. Кажется, сервер получает 0x01, поскольку он обрабатывает входящее сообщение как запрос на вход. Он также получает размер. Проблема возникает при копировании хэша имени пользователя и пароля из data1 и data2.
Когда cout'ing на сервере, кажется, первые три буквы имени пользователя не прочитаны сервером. Когда я пытаюсь войти с именем «username», сервер получает «rname», а PWHash имеет аналогичное смещение (3 * sizeof (char)). Это происходит только при запуске приложения на самом устройстве, а не в симуляторе.
Я признаю, что недавно я изменил компоновку структур - до сих пор дополнительное поле имело только 8 бит, и после следующего поля у меня было дополнительное int: 8. Я обновил структуры с этой информацией как на клиенте, так и на сервере, и запустил чистую + перестройку для обоих, поэтому я не понимаю, почему это имеет значение. И по сути, 8 + 8 = 16, который является новым размером дополнительного поля, поэтому поля data1 и data2 должны начинаться с того же смещения в памяти, что и для старых структур.
Любая помощь с этим была бы принята с благодарностью! Я очень зациклен на этом, и это действительно раздражает, не зная, что вообще не так. Это может быть утверждение для всего, что я знаю (iPhone байтабельный, не так ли?), Но если это так, я понятия не имею, как сервер интерпретирует 0x01 как 0x01 ... ну хорошо. Заранее спасибо!
Сервер является фактическим удаленным сервером, как я понимаю, не так ли? Потому что если это «localhost», вам нужно использовать «IP» локального хоста, а не использовать «localhost» в вашем приложении. – Neeku
Просто мысль: может быть проблема utf8? Я имею в виду ваше имя пользователя на самом деле «имя пользователя» или это что-то написано на норвежском языке? – gWiz
Сервер удален, и у меня есть полный адрес ipv4, жестко закодированный в моем приложении. @gWiz: мое имя пользователя состоит только из простых букв из английского алфавита. По сути, клиент только принимает имена пользователей в [a ... z]. –