【问题标题】:WIN32 send data in socket function arg errorWIN32在套接字函数arg错误中发送数据
【发布时间】:2018-12-14 07:01:07
【问题描述】:

使用 WIN32 API 处理程序我希望程序从收集系统中某些信息的函数中获取数据,并将参数作为 char 传递给 DbgPrint 函数,我希望将该 char 发送到该 ip 和端口 如何获取函数 args 中没有任何错误的情况下完成了工作
我的代码就像:

#include <winsock2.h>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
void socketfnt (auto *ipaddr, auto *portn, char*msg){
WSADATA wsa;
SOCKET s;
struct sockaddr_in server;

printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
    printf("Failed. Error Code : %d",WSAGetLastError());
    return 1;
}

printf("Initialised.\n");

//Create a socket
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
    printf("Could not create socket : %d" , WSAGetLastError());
}

printf("Socket created.\n");
server.sin_addr.s_addr = inet_addr(ipaddr);
server.sin_family = AF_INET;
server.sin_port = htons( portn );

//Connect to remote server
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
    puts("connect error");
    return 1;
}

puts("Connected");
message = msg;
if( send(s , message , strlen(message) , 0) < 0)
{
    puts("Send failed");
    return 1;
}
puts("Data Send\n");

return 0;
}


void DbgPrint(char *msg){
socketfnt("192.168.1.6","4444", msg);
}

编译器显示错误,如

fff.c:6:23: error: storage class specified for parameter 'ipaddr'
fff.c:6:37: warning: type defaults to 'int' in declaration of 'portn' [- 
Wimplicit-int]
void socketfnt (auto *ipaddr, auto *portn, char*msg){

你们能告诉我如何以正确的方式将参数传递给 socketfnt 函数吗 ,问候

【问题讨论】:

  • 在函数参数中滥用auto关键字。
  • 那么在这种情况下,函数参数中正确的数据类型是什么
  • inet_addr() 采用 const char* 参数,htons() 采用 uint16_t。所以,我会这样做:void socketfnt (const char *ipaddr, uint16_t portn, char*msg)
  • 那么您必须更正对(例如)socketfnt("192.168.1.6",4444, msg); 的调用(因为第二个参数是整数而不是字符串)。
  • 显示 /include/winsock2.h:997:34: 注意:预期为 'const char *' 但参数类型为 'char' WINSOCK_API_LINKAGE int WSAAPI send(SOCKET s,const char *buf,int len,int 标志); ^

标签: c winapi winsock


【解决方案1】:

您不能将 auto 用于非 lambda 函数的参数。您需要使用正确的数据类型。

你也在泄露资源。

试试这个:

#include <winsock2.h>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

void socketfnt (const char *ipaddr, uint16_t portn, const char *msg)
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;

    puts("\nInitializing Winsock...");

    int ret = WSAStartup(MAKEWORD(2,2), &wsa);
    if (ret != 0)
    {
        printf("Failed. Error Code : %d\n", ret);
        return 1;
    }

    puts("Initialized.\n");

    //Create a socket
    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        printf("Could not create socket : %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    puts(Socket created.\n");

    memset(&server, 0, sizeof(server));
    server.sin_addr.s_addr = inet_addr(ipaddr);
    server.sin_family = AF_INET;
    server.sin_port = htons(portn);

    if (server.sin_addr.s_addr == INADDR_NONE)
    {
        puts("Invalid IP address.\n");
        closesocket(s);
        WSACleanup();
        return 1;
    }

    //Connect to remote server
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        printf("Could not connect socket : %d\n", WSAGetLastError());
        closesocket(s);
        WSACleanup();
        return 1;
    }

    puts("Connected\n");

    int size = strlen(msg);
    while (size > 0)
    {
        ret = send(s, msg, size, 0);
        if (ret < 0)
        {
            printf("Could not send data : %d\n", WSAGetLastError());
            closesocket(s);
            WSACleanup();
            return 1;
        }
        msg += ret;
        size -= ret;
    }

    puts("Data Send\n");

    closesocket(s);
    WSACleanup();

    return 0;
}

void DbgPrint(const char *msg)
{
    socketfnt("192.168.1.6", 4444, msg);
}

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多