gpt4 book ai didi

c - 在Windows中的套接字上使用fprintf

转载 作者:行者123 更新时间:2023-12-03 11:51:15 26 4
gpt4 key购买 nike

我正在尝试在Windows的套接字上使用fprintf。许多在线示例是UNIX examples。 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

更新我更紧密地发现了 reading this post的领先优势。
如果我更换:
fprintf(file_handle_to_socket, "Hello World\r\n");


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

有用。

不过,这仍然不是我问题的完整答案。我正在寻找直接使用fprintf()的方法。

最佳答案

套接字不是文件句柄,因此不能使用_open_osfhandle()对其进行包装。这就是fprintf()无法正常工作的原因。 fprintfsock()是专门设计用于直接与套接字一起使用的。它只是一个包装器,用于将数据格式化为本地缓冲区,然后使用套接字API send()函数进行发送。如果您确实想将fprintf()与套接字一起使用,则必须先#undef fprintf,然后再使用#define fprintf()将其重新映射到fprintfsock()(仅在使用支持可变参数宏的编译器时才有效)。否则,只需直接使用fprintfsock()

关于c - 在Windows中的套接字上使用fprintf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com