我正在尝试在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();
当我运行它时,另一端没有任何东西(使用putty),我在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()。
答案 0 :(得分:0)
我对客户端部分fprintf on socket using mingw有类似的担忧,您应该尝试以非重叠模式创建套接字:
int sock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);