原始套接字程序出错,error C2227: 的左边必须指向类/结构/联合/泛型类型
应该是指针的问题吧, 报了一堆的错。求大神
1>e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(185): error C2027: 使用了未定义类型“main::ip”
1> e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(177): note: 参见“main::ip”的声明
1>e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(185): error C2227: “->Version”的左边必须指向类/结构/联合/泛型类型
1> e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(177): note: 参见“main::ip”的声明
1>e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(186): error C2027: 使用了未定义类型“main::ip”
1> e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(177): note: 参见“main::ip”的声明
1>e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(186): error C2227: “->HeadLen”的左边必须指向类/结构/联合/泛型类型
1> e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(177): note: 参见“main::ip”的声明
1>e:\我的数据文件\visual studio 2015\projects\udp\sock1sender\sender.cpp(187): error C2027: 使用了未定义类型“main::ip”
......
程序是用原始套接字进行发送
程序代码:
//发送端
#include <WinSock2.h>
#include<stdio.h>
#include<conio.h>
#include<memory.h>
#include <WS2tcpip.h>
#pragma comment (lib,"ws2_32.lib")//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上
#define DESTPORT 8000
#define SOURCEPORT 8000
#define SOURCEADDR "192.168.191.3"
#define MAXDATASIZE 100
typedef struct IP_HEAD //定义IP数据包数据结构
{
union
{
unsigned char Version;
unsigned char HeadLen;
};
unsigned char ServiceType;
unsigned short TotalLen;
unsigned short Identifier;
union
{
unsigned short Flags;
unsigned short FragOffset;
};
unsigned char TimeToLive;
unsigned char Protocol;
unsigned short HeadChecksum;
unsigned int SourceAddr;
unsigned int DestinAddr;
unsigned char Options;
}ip_head;
struct baohead
{
int size;
int id;
int recvsize;
};
typedef baohead ElemType;
struct sendbuf
{
ElemType head;
char buf[60 * 1024];
int bufSize;
};
struct sendbuf data;
SOCKET sock;
int sendexit = 0;
int recvexit = 0;
int filesize = 0;
int recvsize = 0;
struct sockaddr_in server;
int len = sizeof(server);
int SendId = 0;
int RecvId = 0;
int send_flag = 0;
int main()
{
char * shuju;
char buffer[MAXDATASIZE];
char msg[] = "welcome\n";
int msglen = strlen(msg);
//启动winsock
WSADATA WSAData;
WSAStartup(MAKEWORD(2, 2), &WSAData);
//初始化socket创建,原始套接字
SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sock == SOCKET_ERROR)
{
printf_s("socket创建失败\n");
return 0;
}
else
{
printf_s("客户端启动成功\n");
}
//desktop();
/*设置IP_HDRINCL选项,构造自己的IP头部*/
bool flag = true;
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
//填充sockaddr_in
server.sin_family = AF_INET; //host_addr,server
server.sin_port = htons(DESTPORT);
server.sin_addr.s_addr = inet_addr(SOURCEADDR);
//socket绑定
bind(sock, (PSOCKADDR)&server, sizeof(server)); //初始化socket(绑定)
//将网卡模式调为混杂,捕获所有的IP数据包,网卡不能接收mac地址不是自己的IP数据包
DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
//发送缓冲区
char buffer2[65536] = {0};
struct ip *ip;
//struct tcphdr *tcp;
int head_len;
int i;
head_len = sizeof( ip) + msglen;
//ip_head ip = *(ip_head *)buffer2;
ip = (struct ip *)buffer2;
/*初始化IP头部*/
ip->Version = (ip->Version >> 4);
ip->HeadLen = ((ip->HeadLen & 0x0f) * 4);
ip->ServiceType = 0;
ip->TotalLen = htons(head_len);
ip->Identifier = 0;
ip->Flags = 0;
ip->FragOffset= (ip->FragOffset & 0x1fff);
ip->TimeToLive = (int)ip->TimeToLive;
ip->Protocol = (int)ip->Protocol;
ip->HeadChecksum = 0;
ip->SourceAddr = inet_addr(SOURCEADDR);
ip->DestinAddr = inet_addr(SOURCEADDR);
/*让shuju指针指向数据存储处*/
shuju = &buffer2[sizeof( ip)];
memcpy(shuju, msg, msglen);
/*接收客户端发来的数据*/
while (1)
{
sendto(sock, buffer2, head_len, 0, (sockaddr*)&server, len);
}
/*关闭套接字*/
closesocket(sock); //关闭socket
WSACleanup(); //关闭winsock
}