WSASend: отправить int или struct - PullRequest
0 голосов
/ 25 ноября 2010

Я хотел бы использовать функцию MS для отправки данных.

Я не нашел примеров, когда они отправляют данные другого типа, кроме const char *. Я пытался отправить int или другое, но мне не удалось.

WSASend () и send () обе функции принимают только параметры Char *.

Как мне поступить?

Спасибо

Ответы [ 2 ]

1 голос
/ 25 ноября 2010

Параметр const char * указывает, что функция принимает указатель на байты. Ведьма, кажется, действительно является результатом педантичных дизайнеров API сокетов - C имеет универсальный тип для обработки любого типа указателя без явных приведений: void *.

Вы можете создать удобную оболочку для отправки, например, такую, которая позволит вам отправлять любую (непрерывную) вещь, на которую вы можете сделать указатель:

int MySend(SOCKET s, const void* buf, int len,int flags)
{
  return send(s,(const char*)buf,len,flags);
}

Использование void * вместо char * на самом деле делает API более безопасным, поскольку теперь он может определять, когда вы делаете что-то глупое:

int x=0x1234;
send(s,(const char*)x,sizeof(x),0); // looks right, but is wrong.
mysend(s,x,sizeof(x),0); // this version correctly fails
mysend(s,&x,sizeof(x),0); // correct - pass a pointer to the buffer to send.

WSASend немного сложнее сделать удобную ваппер, так как вам нужно передать ему массив структур, содержащих символы *, но опять же это случай определения эквивалентной структуры с помощью const void * место константных символов *, а затем приведение структур данных к типам WSA в удобной оболочке. Сделайте это правильно один раз, и остальную часть программы будет намного легче определить правильно, так как вам не нужны повсеместные приведения, скрывающие потенциальные ошибки.

1 голос
/ 25 ноября 2010

Это просто указатель на буфер, этот буфер может содержать все, что вы хотите.

Этот символьный указатель на самом деле является адресом байтового массива, эта функция также требует параметра длины.

Целое число - это 2/4 (короткое / длинное) значение байта,

Тогда, если вы хотите отправить целочисленную переменную (например), вы должны передать ее адрес и длину.

WSASend и send - это простые функции, которые отправляют блок памяти.

Я предполагаю, что вы говорите о C, вы должны понимать, что переменные char в C являются байтами - блок из 8 битов, переменные char содержат любое значение от 0 до 255.

Указатель на char var - это адрес байта (который может быть первой ячейкой массива байтов).

Я думаю, вот что вас смущает.

Надеюсь, вы понимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...