Hi everyone, I'm trying to create a PF_PACKET socket and send a frame to another host, I know the destination's mac address
and interface index, and I want to use my own protocol no., so I defined a PROTONO as 0x2323, here's the code of sender
Code:
int main(int argc, char **argv)
{
int sockfd;
//struct sockaddr_in servaddr;
struct sockaddr_ll servaddr, bindaddr;
bzero(&servaddr, sizeof(servaddr));
//destination's ifindex and addr is known
servaddr.sll_family = AF_PACKET;
servaddr.sll_ifindex = 4;
servaddr.sll_halen = 6;
servaddr.sll_addr[0] = 0x00;
servaddr.sll_addr[1] = 0x0C;
servaddr.sll_addr[2] = 0x29;
servaddr.sll_addr[3] = 0xDF;
servaddr.sll_addr[4] = 0x27;
servaddr.sll_addr[5] = 0xAC;
servaddr.sll_addr[6] = 0x00;
servaddr.sll_addr[7] = 0x00;
sockfd = Socket(PF_PACKET, SOCK_DGRAM, htons(MYPTNO));
char buffer[512];
sprintf(buffer, "---toBeSent---\n");
sendto(sockfd, buffer, strlen(buffer), 0, (SA*)&servaddr, sizeof(servaddr));
exit(0);
}
and at the receiver side,I want to get frames to each interface, so I use 0 as the sll_ifindex number.
Code:
#define MYPTNO 0x2323
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_ll servaddr, cliaddr;
sockfd = Socket(PF_PACKET, SOCK_DGRAM, htons(MYPTNO));
bzero(&servaddr, sizeof(servaddr));
servaddr.sll_family = AF_PACKET;
servaddr.sll_protocol = htons(MYPTNO);
servaddr.sll_ifindex = 0;//bind to every interface
Bind(sockfd, (SA *) &servaddr, sizeof(servaddr));
char buff[512];
int n = 0;
int length;
n = recvfrom(sockfd, buff, 512, 0, (SA*)&cliaddr, &length);
buff[n] = 0;
printf("%s\n", buff);
printf("%s\n", Sock_ntop((SA*)&cliaddr, length));
return 0;
}
But these doesn't work, need I bind the receiver's socket? could anybody help me figure out what's going wrong here? THankS!