Параметр 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 в удобной оболочке. Сделайте это правильно один раз, и остальную часть программы будет намного легче определить правильно, так как вам не нужны повсеместные приведения, скрывающие потенциальные ошибки.