2

Windowsのソケットでfprintfを使用しようとしています。オンラインの例の多くはUNIXの例です。Windowsの同等のコードは、私がここで求めているものです。

最終的に、私はこれをしたいと思います:

fprintf(file_handle_to_socket, "hello world\r\n");

WriteFile、snprintfなどは使いたくありません。fprintf()だけです。

多かれ少なかれ手順を示す擬似コードが役立つでしょう。

これが私がこれまでに持っているものです:

unsigned short port = enter_port;

int result = 0;
WSADATA wsaData;
result = WSAStartup(MAKEWORD(2, 2), &wsaData);

struct sockaddr_in local;
memset(&local, 0, sizeof(struct sockaddr_in));

local.sin_port = htons(port);
local.sin_family = AF_INET;
local.sin_addr.s_addr = htonl(INADDR_ANY);

int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
{
    fprintf(stdout,"invalid socket: error code %d\n", WSAGetLastError());
}

result = bind(sock, (struct sockaddr*)&local, sizeof(struct sockaddr_in));
if(result == SOCKET_ERROR)
{
    fprintf(stdout,"bind() failed: error code %d\n", WSAGetLastError());
}

result = listen(sock, 5);

struct sockaddr peer;
memset(&peer, 0, sizeof(struct sockaddr));

SOCKET client = 0;
int size = sizeof(struct sockaddr);
client = accept(sock, &peer, &size);

int OSFileHandle = _open_osfhandle(client, _O_APPEND);
FILE * file_handle_to_socket = fdopen(OSFileHandle, "w+");

fprintf(file_handle_to_socket, "Hello World\r\n");

// hoping this helps -- it doesn't
fflush(file_handle_to_socket);

fclose(file_handle_to_socket);
closesocket(client);

// this throws an exception
WSACleanup();

これを実行すると、(パテを使用して)もう一方の端には何も表示されず、WSACleanup()で例外が発生します。WSACleanupの例外はですAn invalid handle was specified

更新この投稿をもっと詳しく読んで、強いリードを見つけました。交換した場合:

fprintf(file_handle_to_socket, "Hello World\r\n");

fprintfsock(client, "Hello World\r\n");

できます。

しかし、それはまだ私の質問に対する完全な答えではありません。fprintf()を直接使用したいと思っています。

4

2 に答える 2

4

_open_osfhandle()ソケットはファイルハンドルではないため、それをラップするために使用することはできません。それが機能していない理由fprintf()です。 fprintfsock()ソケットを直接操作するように特別に設計されています。send()これは、データをローカルバッファーにフォーマットし、ソケットAPI関数を使用して送信するラッパーにすぎません。本当にソケットで使用したい場合fprintf()は、ソケットを#undef fprintf#define fprintf()マップするfprintfsock()必要があります(これは、可変個引数マクロをサポートするコンパイラを使用している場合にのみ機能します)。それ以外の場合は、fprintfsock()直接使用してください。

于 2013-01-15T19:01:22.273 に答える
0

mingwを使用したソケットのクライアント部分fprintfについても同様の懸念があります。オーバーラップしないモードで、ソケットを作成してみてください。

int sock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
于 2014-10-31T13:02:42.657 に答える