Sockets 将原始数据发送到IP(TCP/IP)
我正在努力学习WinSock,并坚持到底。我想将原始数据包(256字节)发送到网络中的另一个设备。这个设备只是一个侦听器。我正在使用VC++2010和WinSock 我正在编写一个代码:Sockets 将原始数据发送到IP(TCP/IP),sockets,tcp,c++-cli,winsock,Sockets,Tcp,C++ Cli,Winsock,我正在努力学习WinSock,并坚持到底。我想将原始数据包(256字节)发送到网络中的另一个设备。这个设备只是一个侦听器。我正在使用VC++2010和WinSock 我正在编写一个代码: // winsock.cpp : main project file. #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <string.h
// 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;
}
//winsock.cpp:主项目文件。
#包括“stdafx.h”
#包括
#包括
#包括
#包括
//#包括
#定义WIN32_精益_和_平均值
使用名称空间系统;
int main(数组^args)
{
文字要求版本;
WSADATA WData;
插座;
地址中的结构sockaddr\u;
长瓦尔;
结构宿主*he;
字符主机[128];
国际港口;
printf(“主机:”);
scanf(“%s”,主机);
printf(“端口:”);
scanf(“%d”、&port);
printf(“要发送的数据:”);
scanf(“%d”和&val);
RequiredVersion=MAKEWORD(2,0);
如果(WSAStartup(必需版本和WData)!=0){
printf(“错误!WinSock2\n”);
返回1;
}
//he=gethostbyaddr((char*)主机,4,AF_INET);
he=gethostbyname(主机);
if(he==NULL){
printf(“找不到主机。\n”);
系统(“暂停”);
返回1;
}
addr.sin_family=AF_INET;
地址SINU port=htons(端口);
addr.sin_addr.s_addr=*((无符号长*)he->h_addr);
s=插座(AF_INET、SOCK_RAW、IPPROTO_TCP);
//短袜(生的,IPPROTO(TCP));
连接(s,(struct sockaddr*)和addr,sizeof(addr));
printf(“将%d发送到%s\n”,val,inet_ntoa(addr.sin_addr));
val=htonl(val);
发送(字符*)&值,大小(长),0;
printf(“等待响应…\n”);
recv(s,(char*)和val,sizeof(long),0;
val=ntohl(val);
printf(“RE:%d\n”,val);
插座;
WSACleanup();
系统(“暂停”);
返回0;
}
我遇到的问题:
// 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;
}
有什么建议吗?我真的很感激你能提供的任何帮助 请坚持一个问题。本问题是作为代码审查制定的,附带至少三个问题。我认为您应该首先提出一个简单的问题,询问如何使用硬编码的IP,而不是使用
gethostbyname
。一旦消除了这种混淆,大家就会更容易理解代码中的任何问题。这是故意的吗?如果你将项目转换成标准C++,你可能会吸引更多的人。看看这是否有帮助:回复:gethostbyname
和IP地址-您可能正在查找inet\u addr
。好的,只需将代码更改为const。知识产权。像这样:addr.sin\u addr.s\u addr=inet\u addr(“192.168.1.130”)代码>但数据仍未发送。您还应更新此问题。有一个“编辑”链接。问题中包含的代码应该是您遇到的问题的一部分。你还应该删除你的三个问题清单,并清楚地说明你剩下的一个问题。也许你的问题是“我认为这应该发送数据,但当我使用WireShark进行监视时,什么也不发送。如果我将套接字类型更改为SOCK_DGRAM
,它似乎可以工作。为什么它不能与SOCK_RAW
”一起工作呢?就目前而言,你没有提出一个明确的问题。