Member 14825085 Ответов: 3

Может ли кто-нибудь предложить мне руку помощи?


Я пытаюсь отправить 2d-массив символов с сервера на клиент,но это не работает, он ничего не печатает на клиенте.Я использую протокол TCP/IP.Не могли бы вы помочь мне с каким-нибудь кодом?

Что я уже пробовал:

************SERVER*********

char arr[20][20];

int i,j; 
 for(i=0;i<20;i++){
	for(j=0;j<20;j++){
		send(sock,&arr[i][j],sizeof(char),0);

	}


	}
*******CLIENT***************************

char arr[20][20];


int i,j; 
 for(i=0;i<20;i++){
	for(j=0;j<20;j++){
  		recv(sock,&arr[i][j],sizeof(char),0);
		printf("%s",arr[i][j]);
	}


	}

Afzaal Ahmad Zeeshan

Конечно,

Как вы подключаетесь или устанавливаете соединение по протоколу TCP/IP? Можете ли вы поделиться точками входа для этих двух программ?

Member 14825085

Это просто типичное соединение tcp/ip, а не что-то особенное, братан

jeron1

Итак, вам удалось установить соединение TCP/IP?

Member 14825085

Да я уже отправлял несколько простых сообщений и отлично работал

jeron1

Возвращаемое значение из функции send () - это то, что вы ожидаете?

Member 14825085

Да я проверяю это

jeron1

Может быть, вы могли бы попробовать Форматировать как символ, а не строку, в вашем случае
заявление printf? (%c вместо %s)

0x01AA

Теперь трудно помочь, что вы исключаете и что получаете?
На первый взгляд я бы сказал, что вы путаете индексы. Вы заявляете: i и j но после этого вы используете во внешнем и внутреннем for только оба раза i..- это не может кончиться хорошо ;)

Member 14825085

Извините, что это была моя ошибка при копировании, это я в первом цикле и j во втором. Я ожидаю, что клиент распечатает массив, который я отправляю с сервера

0x01AA

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

Member 14825085

Ладно извини за это

0x01AA

Не нужно извиняться, просто исправьте это ;)

RickZeeland

Вы используете Windows или Linux ?

0x01AA

Почему, извините за вопрос? Но отличаются ли сокеты windows и linux для необработанных данных?
Заранее Вам большое спасибо.

RickZeeland

Это скорее вопрос включенных библиотек, например, для Windows вы можете включить Winsock2.h. Излишне говорить, что это не будет компилироваться для Linux.

Member 14825085

Линукс

3 Ответов

Рейтинг:
2

RickZeeland

Вот реализация, которая может быть использована как для Windows, так и для Linux:
C sockets portable in windows/linux пример · GitHub[^]

sizeof(char)
не получится, нужно передать длину строки.


Member 14825085

Rickzeeland спасибо ему за это, но что я должен делать когда я хочу послать в 2D массив char;

Рейтинг:
1

Rick York

Есть несколько различных способов сделать это. Поскольку вы используете C и вообще не описали природу своих данных, я сделаю некоторые предположения. Основной из них заключается в том, что они будут строками переменной длины, поэтому я бы записал данные с байтами длины.

Сначала запишите количество строк данных. Используйте для этого четыре байта. Затем запишите это количество строк текстовых данных. Просто чтобы вы не слишком запутывались, я бы написал индекс и длину для каждой строки текста. Используйте четыре байта для индекса и два для длины. Затем вы записываете байты (длины) строки. Продолжайте делать это для каждой строки данных. Если вы хотите, то можете написать маркер конца массива. Это может быть так же просто, как несколько байтов нулей.

Чтение будет почти таким же, как письмо. Вы должны очистить байты сообщения и убедиться, что у вас есть еще ожидающие вас. Это одно из применений опции "подглядывать". Вы могли бы немного упростить ситуацию и сначала просмотреть свои данные и выяснить, сколько вы будете отправлять и записывать их в виде первых четырех байтов. За этим будет следовать количество строк, а затем строки текста. Это простая операция - число строк умножить на шесть плюс длина каждой строки плюс четыре для начальной длины и четыре для окончания.

Вы можете дополнительно написать завершающий нулевой символ с каждой строкой, и если вы это сделаете, то у меня будет длина байтов, включающих нуль. Я имею в виду, что если в одной строке есть "abc", и Вы тоже пишете нуль, то его длина должна быть четыре.

Как я уже писал, это только одна возможность, и их много.


Рейтинг:
1

Richard MacCutchan

Ваш код несколько запутан. Вам не нужно отправлять символы по 1 за раз. Основной цикл должен выполняться 20 раз, и каждый раз он может посылать 20 символов. А длина ваших отправленных и полученных данных не должна быть такой sizeof(char) (что равно 8), но количество байтов в данных, которое в данном случае равно 1. Кроме того, вы пытаетесь напечатать один символ, но ссылаетесь на него как на строку. Правильный элемент управления форматом для одного символа-это %c И если вы не знаете, что 20 символов содержат нулевую последовательность завершения, вы никогда не должны использовать %s .

Взгляните на это send(2): отправить сообщение на socket - Linux man page[^] для получения более подробной информации.