Взаимодействие java и c
От: Аноним  
Дата: 25.09.07 09:57
Оценка:
Такая ситуация. Есть серверный сокет на си. К нему конектится сокет на java и посылает строку
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sok.getOutputStream())), true);          
String comand_line = "echo Test command line";          
//посылаем команду...
out.write(comand_line);
out.flush();

Серверный сокет получает строку, печатает ее и записывает в файл
if((batfile = fopen(batfilename, "w+")) == NULL)
{
  printf("Cant't create bat file %s\n", batfilename);
  fprintf(logfile, "Cant't create bat file %s\n", batfilename);
  exit(1);
}
//Here code for writing bat file. Need to choose separator between cmd commands.
//============ Begin ========
iResult = recv(writefd, recvbuf, recvbuflen, 0);
char *bat_file = (char*)malloc((iResult)*sizeof(char));
memcpy(bat_file, recvbuf, iResult);
printf("Number of byte = %d Command = %s\n", iResult, bat_file);
free(bat_file);
fclose(batfile);

Но печатается какая то хрень в конце: Number of byte = 23 Command = echo Test command line
Ён║лллллллл
И в файл записывается почему то 40 байт:
echo Test command line
²²²²║
≡¡║½½½½½½½½
Кто-нибудь встречался с таким...
Re: Взаимодействие java и c
От: remark Россия http://www.1024cores.net/
Дата: 25.09.07 10:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>if((batfile = fopen(batfilename, "w+")) == NULL)
А>{
А>  printf("Cant't create bat file %s\n", batfilename);
А>  fprintf(logfile, "Cant't create bat file %s\n", batfilename);
А>  exit(1);
А>}
А>//Here code for writing bat file. Need to choose separator between cmd commands.
А>//============ Begin ========
А>iResult = recv(writefd, recvbuf, recvbuflen, 0);
А>char *bat_file = (char*)malloc((iResult + 1)*sizeof(char));
А>memcpy(bat_file, recvbuf, iResult);
А>bat_file[iResult] = 0;
А>printf("Number of byte = %d Command = %s\n", iResult, bat_file);
А>free(bat_file);
А>fclose(batfile);
А>



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Взаимодействие java и c
От: Аноним  
Дата: 25.09.07 10:21
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:


А>>
А>>if((batfile = fopen(batfilename, "w+")) == NULL)
А>>{
А>>  printf("Cant't create bat file %s\n", batfilename);
А>>  fprintf(logfile, "Cant't create bat file %s\n", batfilename);
А>>  exit(1);
А>>}
А>>//Here code for writing bat file. Need to choose separator between cmd commands.
А>>//============ Begin ========
А>>iResult = recv(writefd, recvbuf, recvbuflen, 0);
А>>char *bat_file = (char*)malloc((iResult + 1)*sizeof(char));
А>>memcpy(bat_file, recvbuf, iResult);
А>>bat_file[iResult] = 0;
А>>printf("Number of byte = %d Command = %s\n", iResult, bat_file);
А>>free(bat_file);
А>>fclose(batfile);
А>>

R>

CПС!!!
Чтобы понять для себя...
Резервируем +1 байт для символа окочания строки
только почему
bat_file[iResult] = 0;

а не
bat_file[iResult] = '\0';

и еще я пытался вот так делать...
strcat(bat_file, "\0");

не получилось
и вот так
strcat(bat_file, '\0');

аксесс виолейшен...
Я подозревал что что-то не то с концом строки...
Re[3]: Взаимодействие java и c
От: remark Россия http://www.1024cores.net/
Дата: 25.09.07 10:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>CПС!!!

А>Чтобы понять для себя...
А>Резервируем +1 байт для символа окочания строки

Да

А>только почему

А>
bat_file[iResult] = 0;

А>а не
А>
bat_file[iResult] = '\0';


В данном случае это одно и тоже. 0 неявно приводится к '\0'.

А>и еще я пытался вот так делать...

А>
strcat(bat_file, "\0");

А>не получилось
А>и вот так
А>
strcat(bat_file, '\0');

А>аксесс виолейшен...
А>Я подозревал что что-то не то с концом строки...

Это можно делать только тогда, когда у строки *уже* есть конец строки. А пока его это — некорректная строка. И соотв. функции работы со строками не работают. Поэтому тут надо вручную добавить конец строки.


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Взаимодействие java и c
От: Кодт Россия  
Дата: 25.09.07 11:51
Оценка:
Здравствуйте, remark, Вы писали:

Уточнение.

А>>и еще я пытался вот так делать...

А>>
strcat(bat_file, "\0");

А>>не получилось

Потому что strcat дописывает в конец строки bat_file (там, где находится маркер NUL = '\0') — а его ещё нет. Точнее, он есть где-то за пределами осмысленного текста, и скорее всего, относится к совершенно другим данным. Попытка записи туда приведёт к сюрпризам.

А>>и вот так

А>>
strcat(bat_file, '\0');

А>>аксесс виолейшен...

А здесь всё гораздо жёстче: литерал '\0' == литерал 0 == универсальный ноль --> указатель (const char*)NULL,
вот и получили чтение по нулевому адресу.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.