Работа с протоколом IPX в С

M8
На сайте с 31.05.2009
Offline
40
649

Помогите пожалуйста передать простые числа на сервер. Помещаю число в буфер

strcpy(TxBuffer,chislo); у клиента , а на сервере это число выводится искаженно.

исходник клиента:

/************************************************************/

/* Файл IPXCLIEN.C */

/************************************************************/

#include "ipx"

#define BUFFER_SIZE 512 /* Макс. размер буфера данных */

#include <stdio.h>

#include <string.h>

struct ECB RxECB, TxECB;

struct IPX_HEADER RxHEADER, TxHEADER;

main (void)

{

int j,i;

char ch1;

unsigned char chislo=20; /* передаваемое число */

unsigned char int1=55;

/* unsigned char fgh[10];

strcpy(fgh,"privet"); */

clock_t tim1,tim2,tim3; /* Фиксаторы системного времени */

/* Используем сокет 0x4545 (диапазон сокетов 4000h-8000h) */

unsigned socket_client = 0x4343;

unsigned socket_serv = 0x4545;

/* ECB для приема и передачи пакетов */

extern struct ECB RxECB, TxECB;

/* Заголовки принимаемых и передаваемых пакетов */

extern struct IPX_HEADER RxHEADER, TxHEADER;

/* Буферы для принимаемых и передаваемых пакетов */

unsigned char RxBuffer;

unsigned char TxBuffer;

printf("\n * К л и е н т IPX *\n");

/* Есть ли IPX и SPX ? */

i=ipx_spx_API();

if (i==1) printf("\n IPX и SPX найдены, ");

else

{

if (i==0) printf("\nIPX найден, а SPX не найден ");

else {printf("\nIPX и SPX не найдены "); exit(-1);};

};

/* Откроем сокет. Его используем сначала для передачи, */

/* а потом для приема пакета */

if (open_socket (socket_client) !=0)

{printf ("\nОшибка при открытии сокета"); close_socket (socket_client);exit(-1);};

printf ("сокет клиента %x открыт",_DX);

/* Подготовим TxECB для передачи пакета */

memset(&TxECB, 0, sizeof(TxECB));

TxECB.socket = int_swap(socket_client); /* можно ...=4545; */

TxECB.fragment_count = 2;

TxECB.packet[0].address = &TxHEADER;

TxECB.packet[0].size = sizeof(TxHEADER);

TxECB.packet[1].address = TxBuffer;

TxECB.packet[1].size = BUFFER_SIZE;

/* Пакет предназначен всем станциям данной сети */

memset(TxECB.immediate_address, 0xff, 6);

/* Подготовим заголовок пакета */

TxHEADER.packet_type = 4;

memset(TxHEADER.dest_network_number, 0, 4);

memset(TxHEADER.dest_network_node, 0xff, 6);

TxHEADER.dest_network_socket = int_swap(socket_serv);

/* Подготовим данные, которые будем передавать */

strcpy(TxBuffer,chislo);

printf(" \n\n Передать пакет \"широковещательно\" сразу ? <Y,N>\n");

printf(" Примечание: 1 - При 'N' можно просмотреть структуры HEADER и ECB, \n а затем передать пакет.\n ");

printf(" 2 - Сервер должен ОЖИДАТЬ приема пакета.");

ch1=getch(); if(ch1!='y'&&ch1!='Y') view_struct();

/* Передаем пакет всем станциям сети для определения адреса сервера */

tim1=clock();

ipx_send_packet(&TxECB);

do

{ printf(" \n\n Передать пакет еще раз ? <Y,N>\n");

ch1=getch(); if(ch1=='y'||ch1=='Y') ipx_send_packet(&TxECB);

}

while(ch1=='y'|| ch1=='Y');

/* Закроем сокет */

close_socket (socket_client);

exit(0);

}

Исходник сервера:

/************************************************************/

/* Файл IPXSERV.C */

/************************************************************/

#include "ipx"

#define BUFFER_SIZE 512

#include <stdio.h>

#include <string.h>

struct IPX_HEADER RxHEADER, TxHEADER;

struct ECB RxECB,TxECB;

main (void)

{

int i,j,rr; /* Рабочая переменная */

char ch1; /* Рабочая переменная */

clock_t tim1, tim2,tim3; /* Фиксаторы системного времени */

/* Используем сокет 0x4545 (диапазон сокетов 4000h-8000h) */

unsigned socket_serv=0x4545;

unsigned socket_client=0x4343;

/* Этот ECB будет использован и для приема и для передачи */

extern struct ECB RxECB;

/* Заголовки принимаемых и передаваемых пакетов */

extern struct IPX_HEADER RxHEADER, TxHEADER;

/* Буферы для принимаемых и передаваемых пакетов */

unsigned char RxBuffer;

unsigned TxBuffer;

printf("\n * С е р в е р IPX *\n");

/* Есть ли IPX и SPX ? */

i=ipx_spx_API();

if (i==1) printf("\n IPX и SPX найдены, ");

else

{

if (i==0) printf("\nIPX найден, а SPX не найден ");

else {printf("\nIPX и SPX не найдены "); exit(-1);};

};

/* Откроем сокет. Его используем сначала для приема, */

/* а потом для передачи пакета */

if (open_socket (socket_serv) !=0)

{printf ("\nОшибка при открытии сокета");close_socket (socket_serv); exit(-1);};

printf ("сокет сервера %x открыт",_DX);

/* Подготовим RxESB для приема пакета */

memset(&RxECB, 0, sizeof(RxECB));

RxECB.socket = int_swap(socket_serv); /* можно ...=4545; */

RxECB.fragment_count = 2;

RxECB.packet[0].address = &RxHEADER;

RxECB.packet[0].size = sizeof(RxHEADER);

RxECB.packet[1].address = RxBuffer;

RxECB.packet[1].size = BUFFER_SIZE;

printf("\n\n ОЖИДАНИЕ запроса от клиента... \n");

printf("Для ОТМЕНЫ ожидания и просмотра структур HEADER и ECB нажмите на любую клавишу \n");

tim1=clock(); /* Засекаем время начала ожидания */

ipx_listen_for_packet(&RxECB); /* Начинаем "слушать" пакет */

/* Ожидаем приема пакета от клиента */

while(RxECB.in_use)

{ ipx_relinquish_control();

if(kbhit()) { getch(); view_struct(); RxECB.completion_code=0xfe; break;}

}

tim2=clock(); /* Фиксируем время конца ожидания */

if(RxECB.completion_code == 0)

{

printf("\n ПРИНЯТ запрос от клиента %s \n", RxBuffer); /* здесь должно выводится число*/

printf(" Время ожидания приема: %d ", timer(tim1, tim2));

print_time(tim1, tim2);

printf( "\n ---- Для продолжения нажмите на любую клавишу ----");

getch();

/* Теперь подготавливаем ECB для передачи пакета. */

/* Поле immediate_address не заполняем так там уже находится */

/* адрес станции клиента. Это произошло потому, что только что */

/* был принят пакет данных от клиента и поэтому в ECB устано- */

/* вился непосредственный адрес станции, которая отправила пакет */

RxECB.socket = int_swap(socket_serv); /* можно ...=4545; */

RxECB.fragment_count = 2;

RxECB.packet[0].address = &TxHEADER;

RxECB.packet[0].size = sizeof(TxHEADER);

RxECB.packet[1].address = TxBuffer;

RxECB.packet[1].size = BUFFER_SIZE;

/* Подготовим заголовок пакета */

TxHEADER.packet_type = 4;

memset(TxHEADER.dest_network_number, 0, 4);

memcpy(TxHEADER.dest_network_node, RxECB.immediate_address, 6);

TxHEADER.dest_network_socket = int_swap(socket_client); /* можно =4343;*/

do

{ printf(" \n Передать пакет клиенту еще раз ? <Y,N>\n");

ch1=getch(); if(ch1=='y'||ch1=='Y') ipx_send_packet(&RxECB);

}

while (ch1=='y'||ch1=='Y');

printf(" \n Нужен просмотр структур ? <Y,N>\n");

ch1=getch(); if(ch1=='y'||ch1=='Y') view_struct();

/* Закроем сокет */

close_socket (socket_serv);

exit(0);

}

подключаемый файл ipx

/****************************************************************/

/* файл ipxh.h */

/****************************************************************/

/* Заголовок пакета */

struct IPX_HEADER

{

unsigned int checksum;

unsigned int lenght;

unsigned char transport_control;

unsigned char packet_type;

unsigned char dest_network_number [4];

unsigned char dest_network_node [6];

unsigned int dest_network_socket;

unsigned char source_network_number [4];

unsigned char source_network_node [6];

unsigned int source_network_socket;

};

/* Управляющий блок с двумя фрагментами данных */

struct ECB

{

void far *link_address;

void far (*event_servise_routine)(void); /* ESR address */

unsigned char in_use; /* флаг состояния ESB */

unsigned char completion_code; /* код завершения */

unsigned int socket;

unsigned char IPX_workspase[4];

unsigned char driver_workspase[12];

unsigned char immediate_address[6]; /*непосредственный адрес*/

unsigned int fragment_count; /*кол.фрагментов пакета*/

struct {

void far *address; /* Пакет будет состоять из 2-х фраг- */

unsigned int size; /* ментов:заголовка и данных */

} packet [2];

};

struct NET_ADDRESS

{

unsigned char network[4];

unsigned char node[6];

unsigned char socket[2];

};

int ipx_spx_API (void); /* API - Application Programm Interface */

void get_internet_address();

T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

maloi86,

1. странна тема для этого раздела форума.

2. у вас как настроен IPX на машинах, как независимый интерфейс или IPXoverTCP

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
M8
На сайте с 31.05.2009
Offline
40
#2

Я его подключил в свойствах локального подключения(ОС XP) как не зависимый протокол IPX/SPX/NetBIOS/

когда в буфер TxBuffer помещаю символы или числа strcpy(TxBuffer,"Privet"); то они пер

едаются без искажений. а когда передаю в буфер с помощью переменной strcpy(TxBuffer,chislo);

то идет искажение

T.R.O.N
На сайте с 18.05.2004
Offline
314
#3
maloi86:
то идет искажение

это не искажение. Скорее всего число передается в том виде, как оно хранится в памяти, поэтому и беда...

передавайте число как текст, а на приемнике из текста опять получайте число

M8
На сайте с 31.05.2009
Offline
40
#4
T.R.O.N:
это не искажение. Скорее всего число передается в том виде, как оно хранится в памяти, поэтому и беда...
передавайте число как текст, а на приемнике из текста опять получайте число

Это то все хорошо просто над полученным числом на сервере нужно будет делать матматические операции.

T.R.O.N
На сайте с 18.05.2004
Offline
314
#5
maloi86:
Это то все хорошо просто над полученным числом на сервере нужно будет делать матматические операц

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий