我正在尝试学习一些 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;
}
我遇到的问题:
- 我可能没有创建真正的 RAW 套接字。
- 我认为我不应该使用“gethostbyname”,但我不知道如何将它替换为 const。知识产权
- 我的程序没有通过 LAN 发送任何数据。我正在使用 WireShark 来检查这一点。我认为这可能是“gethostbyname”的问题
有小费吗?我非常感谢您提供的任何帮助!