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