原始套接字程序出错,error C2227: 的左边必须指向类/结构/联合/泛型类型

zf826768216 2015-12-22 08:26:18
应该是指针的问题吧, 报了一堆的错。求大神
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
}
...全文
652 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-23
  • 打赏
  • 举报
回复
偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。” 的方法解决的。
fefe82 2015-12-22
  • 打赏
  • 举报
回复
struct ip *ip; 这是啥意思 ...

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧