Как общаться с сервером C из клиента C # с помощью UDP? - PullRequest
0 голосов
/ 02 августа 2011

Моя проблема описана следующим образом:

Мой C# клиент отправляет пакет udp, используя sendto.Поскольку это C#, это байтовый массив, который я построил.

Сервер C получает пакет, используя recvfrom.Через wireshark я подтвердил, что программа C# отправляет пакет и что программа C получает его.recvfrom не выдает никаких ошибок.Но я не могу извлечь какие-либо данные из полученного пакета.Я получаю его в массиве символов.

Конкретные детали: отправляемый мною пакет UDP является запросом.И программа c, и программа C# знают о структуре запроса.Но так как я посылаю массив байтов по проводам, эта структура не имеет значения (я думаю).

Код: C#: Создание пакета: ``

            byte[] tmpB;
            int j = 0;
            char[] reqStr = rsField.reqStr;

            for (; j < reqStr.Length; j++)
            {                    
                tmpB = BitConverter.GetBytes((char)reqStr[j]);
                for (int ctr = 0; ctr < tmpB.Length; ctr++)
                    retVal[i++] = tmpB[ctr];

            }//end of for

            tmpB = BitConverter.GetBytes((UInt32)rsField.fieldLength);
            for (int ctr = 0; ctr < tmpB.Length; ctr++)
                retVal[i++] = tmpB[ctr];

            tmpB = BitConverter.GetBytes((UInt32)rsField.fieldType);
            for (int ctr = 0; ctr < tmpB.Length; ctr++)
                retVal[i++] = tmpB[ctr];

            //------------------------------------------------------------


            tmpB = BitConverter.GetBytes((UInt32)ctField.camType);
            for (int ctr = 0; ctr < tmpB.Length; ctr++)
                retVal[i++] = tmpB[ctr];

            tmpB = BitConverter.GetBytes((UInt32)ctField.fieldLength);
            for (int ctr = 0; ctr < tmpB.Length; ctr++)
                retVal[i++] = tmpB[ctr];

            tmpB = BitConverter.GetBytes((UInt32)ctField.fieldType);
            for (int ctr = 0; ctr < tmpB.Length; ctr++)
                retVal[i++] = tmpB[ctr];

... `` Как видите, у меня есть смесь строковых и числовых полей.(Это не единственные поля, которые у меня есть, код закорочен для удобства чтения)

C: ``

            char buf[1000];
    memset(&buf,'\0',sizeof(buf));
    length = recvfrom (i, &buf, sizeof(buf), 0,
               (struct sockaddr *)&remoteAddr, &fromLen);


    now = time(0);
    if (length == -1) {
        fprintf (stderr, "%s: recvfrom error - %m\n", ctime(&now));
        continue;
    }
    unsigned long fieldType1 = strtoul(bufPtr,0,10);
    bufPtr += 4 * sizeof(char);
    unsigned long fieldLength1 = strtoul(bufPtr,0,10);
    bufPtr += 4 * sizeof(char);
    unsigned long res = strtoul(bufPtr,0,10);

    printf("fieldType: %ld \t fieldLength: %ld \t res: %ld \t \n",fieldType1,fieldLength1,res);

... `` Я убежден, что мне не хватаетфундаментальный аспект во всем этом.Пожалуйста, помогите мне узнать, что это такое.Буду признателен за любую помощь.

Спасибо.

1 Ответ

2 голосов
/ 02 августа 2011

Как только биты записаны в провод, это не C, C ++, C #, Java, FORTRAN, COBOL, lisp, схема, scala или что-то еще. Это биты на проводе. Это фундаментальный аспект, который вам не хватает. Нет структуры для данных на проводе.

После того, как вы прочитали данные, вы можете взять этот набор байтов и применить к нему структуру. Это означает, что вам нужно знать, что первые четыре байта представляют число, а младший байт хранится в самом 0 от начала полезной нагрузки, следующий старший байт находится со смещением 1, следующий старший байт находится со смещением 2, а старший байт находится со смещением 3. Ваш конкретный пример может не иметь ничего общего с описанием, приведенным выше, но идея о том, как упаковать в байты и распаковать из байтов, - это то, на что вам следует обратить особое внимание. *

Убедитесь, что на самом низком уровне вы пишете все байты. Сохраните карту с данными, в каких байтах, а затем запишите каждую сторону сообщения независимо от только что написанной вами спецификации. Не поддавайтесь искушению записать целые целые / шорты / структуры данных в пакет без преобразования их в байты; в противном случае вы обнаружите, что машины на обоих концах могут иметь разные мнения о том, как представлены целые числа / шорты / структуры данных.

...