0

我正在尝试学习一些 WinSock 并卡在原地。我想将 RAW 数据包(256 字节)发送到网络中的另一台设备。这个设备只是一个监听器。我正在使用 VC++ 2010 和 WinSock。

所以我正在处理一个代码:

// winsock.cpp : main project file.

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <string.h>
//#include <WinSock2.h>
#define WIN32_LEAN_AND_MEAN

using namespace System;

int main(array<System::String ^> ^args)
{

WORD RequiredVersion;
    WSADATA WData;
    SOCKET s;
    struct sockaddr_in addr;
    long val;
    struct hostent *he;
    char host[128];
    int port;

    printf("HOST: ");
    scanf("%s",host);
    printf("PORT: ");
    scanf("%d",&port);
    printf("Data to send: ");
    scanf("%d",&val);

    RequiredVersion = MAKEWORD(2, 0);

    if (WSAStartup(RequiredVersion, &WData) != 0) {
    printf("ERROR! WinSock2\n");
    return 1;
    }


    //he = gethostbyaddr((char *) host, 4, AF_INET);
    he = gethostbyname(host);
    if (he == NULL) {
    printf("host not found.\n");
    system("PAUSE");
    return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *((unsigned long*) he->h_addr);

    s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
            //SOCK_RAW, IPPROTO_TCP); 

    connect(s, (struct sockaddr*) &addr, sizeof(addr));
    printf("SENDING %d TO %s\n",val,inet_ntoa(addr.sin_addr));
    val = htonl(val);



    send(s, (char*) &val, sizeof(long), 0);
    printf("WAITING FOR RESPONSE...\n");
    recv(s, (char*) &val, sizeof(long), 0);
    val = ntohl(val);
    printf("RE: %d\n", val);
    closesocket(s);

    WSACleanup();
    system("PAUSE");
    return 0;

}

我遇到的问题:

  1. 我可能没有创建真正的 RAW 套接字。
  2. 我认为我不应该使用“gethostbyname”,但我不知道如何将它替换为 const。知识产权
  3. 我的程序没有通过 LAN 发送任何数据。我正在使用 WireShark 来检查这一点。我认为这可能是“gethostbyname”的问题

有小费吗?我非常感谢您提供的任何帮助!

4

0 回答 0