質問: send(this->m_socket, buffer+buffer_sent, buffer_size-buffer_sent, 0); buffer_sent += sent_size; } // cleanup free(buffer); } よろしくお願いします。
回答: sendの第2引数bufがconst char *なのはインターフェースの設計ミスのようなもので,実質はconst void *です。 なので,tcp/ipを喋る場合に,char *以外の型はsendの第2引数は単純にキャストして渡すことになります。 次に,ワイド文字列の取り扱いですが,smtpプロトコルでは,コマンドはasciiを使います。 なので,コマンド自体をワイド文字列で保持している場合,asciiへの変換が必要になります。 本文に関しては, ・mimeはasciiなので,ワイド文字列で保持しているのであれば変換が必要になります ・contentはcontent-typeやcontent-transfer-encodingに依存します。 content-type: text/plain; charset=utf-16le content-transfer-encoding: 8bit とかすれば,一応そのまま書き込むことが出来ます。 以上のように,ワイド文字列の取り扱いは,winsockの問題ではなく,smtpの問題になります。 なので,一律に変換してくれるようなapiはwinsockにはありません。 # ちなみに,nt系列のosではほとんどのapiではa系apiは内部でデータをw系api用に変換します。