Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 将原始数据发送到IP(TCP/IP)_Sockets_Tcp_C++ Cli_Winsock - Fatal编程技术网

Sockets 将原始数据发送到IP(TCP/IP)

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,并坚持到底。我想将原始数据包(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;

}
//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;

}
  • 我可能没有创建真正的原始套接字
  • 我想我不应该使用“gethostbyname”,但我不知道如何将它替换为const。知识产权
  • 我的程序没有通过局域网发送任何数据。我正在用WireShark检查这个。我认为这可能是“gethostbyname”的问题

  • 有什么建议吗?我真的很感激你能提供的任何帮助

    请坚持一个问题。本问题是作为代码审查制定的,附带至少三个问题。我认为您应该首先提出一个简单的问题,询问如何使用硬编码的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
    ”一起工作呢?就目前而言,你没有提出一个明确的问题。