使用mingw在套接字上使用fprintf

促销网

在Windows的套接字上有一篇有趣的文章使用fprintf,建议将fprintf替换为将格式化缓冲区发送到套接字的包装器。

但是,似乎可以使用_open_osfhandle将套接字转换为filedescriptor。

#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刚退出。

促销网

MSDN文档The socket that is created will have the overlapped attribute as a default

使用WSASocket来创建没有WSA_FLAG_OVERLAPPED标志的套接字可以解决此问题:

int sock = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Windows上使用套接字

来自分类Dev

使用套接字的IllegalBlockingModeException

来自分类Dev

如何使用Ada在套接字上正确读写?

来自分类Dev

仅对套接字上的新数据使用poll()超时

来自分类Dev

Web套接字在OpenShift上断开连接(使用WildFly 8.2.1)

来自分类Dev

使用sails.js访问套接字请求上的会话

来自分类Dev

在已连接的UDP套接字上使用send()

来自分类Dev

在HashLink上使用套接字读取HTTP请求

来自分类Dev

使用套接字的HTTP请求

来自分类Dev

从Android使用HTTP或套接字

来自分类Dev

对UDP套接字使用shutdown()

来自分类Dev

使用增量与套接字轮询

来自分类Dev

正确使用Appengine套接字

来自分类Dev

使用AsyncTask进行套接字

来自分类Dev

在Android中使用套接字?

来自分类Dev

套接字 - 使用选择超时

来自分类Dev

无法通过套接字远程使用python logger,但可在localhost上使用

来自分类Dev

无法通过套接字远程使用python logger,但可在localhost上使用

来自分类Dev

如何使用Qt阻止tcp套接字?

来自分类Dev

使用boost :: asio从套接字读取JSON

来自分类Dev

Python:在OSX中使用原始套接字

来自分类Dev

使用Jasmine测试Web套接字

来自分类Dev

单声道如何使用BSD套接字?

来自分类Dev

套接字EADDRINUSE(地址已在使用中)

来自分类Dev

套接字错误:地址已在使用中

来自分类Dev

使用套接字从页面加载数据

来自分类Dev

在C中使用套接字的HTTP请求

来自分类Dev

如何开始使用Web套接字?

来自分类Dev

使用原始套接字的ping请求失败