使用 mingw 在套接字上使用 fprintf

2024-01-10

有一个有趣的帖子在 Windows 中的套接字上使用 fprintf https://stackoverflow.com/q/14344445/3102264建议将 fprintf 替换为将格式化缓冲区发送到套接字的包装器。

但是,似乎可以使用 _open_osfhandle 将套接字转换为文件描述符。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    if (argc < 3) 
    {
        fprintf(stderr,"usage %s <hostname> <port>\n", argv[0]);
        exit(0);
    }

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    int port = atoi(argv[2]);
    struct hostent *server = gethostbyname(argv[1]);
    if (server == NULL) 
    {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    struct sockaddr_in serv_addr;
    memset(&serv_addr, 0, sizeof(struct sockaddr_in));
    memcpy((char *)&serv_addr.sin_addr.s_addr, (char *)server->h_addr,  server->h_length);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port);

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock == -1)
    {
        perror("socket");
        exit(0);
    }

    int result = connect(sock, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr_in));
    if(result == -1)
    {
        perror("connect");
        exit(0);
    }
    int OSFileHandle = _open_osfhandle(sock, _O_APPEND);
    FILE * fd = fdopen(OSFileHandle, "w+");
    if (fd == NULL)
    {
        perror("fdopen");
        exit(0);
    }   
    fprintf(fd, "Hello World\r\n");
    fclose(fd);

    closesocket(sock);
    WSACleanup();
}

使用此代码连接到服务器(例如 nc -l -p )不起作用。什么也没收到,netcat就退出了。


我猜问题是sock是套接字句柄,而不是文件句柄。根据 MSDN 文档,_open_osfhandle仅适用于文件句柄,不适用于任何其他类型的句柄。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 mingw 在套接字上使用 fprintf 的相关文章

随机推荐

  • 仅从 Chrome 扩展程序安全访问 api

    我正在努力允许 Chrome 扩展通过发布数据向我的网站发布新条目 我希望能够将其锁定 以便只有 chrome 扩展可以发布 如果我从其他地方获取发布数据 我想拒绝它 有谁知道这是否 如何可能 或者你将如何去做 不幸的是 从 Web 服务器
  • 为 Matplotlib 创建默认值集

    我经常为自己的研究制作绘图 所有默认设置都很好 但经常必须切换到为演讲 演示设计绘图 我手动设置所有字体大小大一点 http www mailinglistarchive com html matplotlib users lists so
  • Elixir `mix` 命令抛出错误`无法调用 Module.put_attribute/3,因为模块 Helloworld.MixProject 已编译`

    使用命令设置新项目mix new project name它设置了一切 没有任何 错误或警告消息 cd 到项目并运行命令iex S mix它抛出错误 lib helloworld ex defmodule Helloworld do mod
  • “暂停”被忽略

    我读到我必须能够使用单个命令运行站点中的所有单元测试 因此我创建了一个 bat 文件来执行此操作 即使在结束前暂停 在 phpunit 命令之后 单元测试的结果也会在屏幕中闪烁 echo off cd c cd xampp cd htdoc
  • 访问 Android Wear Fit 数据

    我正在 Samsung Gear Live Google I O 版 上开发一款适用于 Android Wear 的应用程序 它将需要访问心率和步数历史数据 我知道稍后可以使用以下方式访问这些数据谷歌健身 SDK https develop
  • Android中如何获取当前SIM卡号码?

    我想知道 Android 中的用户手机号码 我使用了这个代码 但我没有得到号码 TelephonyManager tm TelephonyManager getSystemService Context TELEPHONY SERVICE
  • mysql 和 30 天

    我正在一个处理免费订阅的网站上工作 我现在想知道如何在 30 天不活动后取消订阅 我知道这必须通过 cron jobs 完成 但我不知道如何在 30 天后计数用户上次登录的时间 SELECT user id FROM users WHERE
  • Visual Studio Code 环绕

    我找不到任何方法可以在 VS Code 中用某些内容包围所选内容 For example doing something like that text gt text just by selecting the word text and
  • jq:错误:无法用字符串索引数组

    我正在尝试为检查点管理服务器 API 编写 bash 脚本 但遇到了一些问题 我想获取 json 字典中的值 为此我必须使用变量 我正在输入这个命令 echo rulebase jq arg n 0 rulebase n to 我收到下一个
  • 阻止浏览器重新发送 post 变量

    当用户尝试登录我的网站时 他的用户名和密码将作为 POST 变量发送 当页面加载时 我获取变量 处理它们并决定登录是否成功 然后 我呈现包含一条消息的页面 通知用户登录成功或失败 我的问题是 如果用户按 F5 或刷新 浏览器会提示他们重新发
  • 如何使用shadow DOM在动态加载的Web组件样式中加载@font-face

    我有一个带有 Shadow DOM 的 HTML 5 WebComponent 它显示的内容必须根据组件中显示的内容类型加载样式 样式表列表是从服务器获取的 我可以像这样加载样式表 for const style of styles con
  • Pandas 中的多索引排序

    我在 pandas df 中有一个包含多索引列的数据集 我想按特定列中的值进行排序 我的数据集如下所示 Group1 Group2 A B C A B C 1 1 0 3 2 5 7 2 5 6 9 1 0 0 3 7 0 2 0 3 5
  • 在 Objective-c xcode 中转换 android 的 AES 加密

    我必须使用类似于下面代码的 AES 加密和解密 需要像android那样传递类似的数据来生成KEY package encypt com import java io BufferedReader import java io FileRe
  • SSH -X“警告:不受信任的 X11 转发设置失败:未生成 xauth 密钥数据”

    嘿 我在使 ssh X 转发正常工作时遇到问题 设置是我ssh从 OSX Yosemite 主机进入我的 ubuntu VM 我已经在 OSX 上安装了 xQuartz 在 ubuntu 上安装了 xauth 并且我相信我已经在 ssh c
  • 使用滑块的模糊效果无法正常工作

    我使用滑块对图像进行模糊效果 我正在使用以下代码 let currentFilter CIFilter name CIGaussianBlur let beginImage CIImage image imgImage image curr
  • 如何编写混合 C 和 C++ 的 makefile

    在这个Makefile中 我不知道如何在同一个Makefile中混合C和C 编译出c对象 如果我首先编译 C 对象 然后运行这个 Makefile 它就可以工作 谁能帮我解决这个问题吗 提前致谢 CXX g CXXFLAGS Wall D
  • FileNotFoundError:使用 jupyter 笔记本时找不到模块

    当我尝试使用 jupyter Notebook 时 收到以下错误消息 FileNotFoundError Traceback most recent call last
  • 无论大小如何,可以使用什么算法来识别图像是否“相同”或相似?

    TinEye http tineye com 反向图像搜索引擎 允许您上传 链接到图像 它能够搜索它已抓取的十亿张图像 并将返回到它发现的相同图像的图像的链接 然而 它不是一个幼稚的校验和或与之相关的任何东西 它通常能够找到比您提供的原始图
  • BOOST ASIO:为什么我在 Windows 中没有得到“bind:地址已在使用中”(但在 Linux 中得到了)?

    尝试绑定已绑定的 TCP 端口应引发异常 绑定 地址已在使用中 异常 Linux 下确实会发生这种情况 但在 Windows 下 不会引发异常 难道是因为在 Windows 下它尝试绑定到任何接口 但在 Linux 中 它尝试绑定到所有这些
  • 使用 mingw 在套接字上使用 fprintf

    有一个有趣的帖子在 Windows 中的套接字上使用 fprintf https stackoverflow com q 14344445 3102264建议将 fprintf 替换为将格式化缓冲区发送到套接字的包装器 但是 似乎可以使用