#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/ether.h>
#define BUF_SIZ 65536
#define SEND 0
#define RECV 1
void send_message(){
//Do something here
memset(&sk_addr, 0, sk_addr_size);
//set sk_addr for 0
sk_addr.sll_ifindex = if_idx.ifr_ifindex;
sk_addr.sll_halen = ETH_ALEN;
byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
printf("success");
}
void recv_message(){
//Do something here
memset(&sk_addr, 0, sk_addr_size);
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
printf("receive %s\n", buf);
}
//Sub function
int main(int argc, char *argv[])
{
int mode;
char hw_addr[6];
char interfaceName[IFNAMSIZ];
char buf[BUF_SIZ];
memset(buf, 0, BUF_SIZ);
//set buf for 0
int correct=0;
if (argc > 1){
if(strncmp(argv[1],"Send", 4)==0){
if (argc == 5){
mode=SEND;
sscanf(argv[3], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &hw_addr[0], &hw_addr[1], &hw_addr[2], &hw_addr[3], &hw_addr[4], &hw_addr[5]);
//set hw_addr
strncpy(buf, argv[4], BUF_SIZ);
//set buf
correct=1;
printf(" buf: %s\n", buf);
}
}
else if(strncmp(argv[1],"Recv", 4)==0){
if (argc == 3){
mode=RECV;
correct=1;
}
}
strncpy(interfaceName, argv[2], IFNAMSIZ); //set interfacename
} //set mode
if(!correct){
fprintf(stderr, "./455_proj2 Send <InterfaceName> <DestHWAddr> <Message>\n");
fprintf(stderr, "./455_proj2 Recv <InterfaceName>\n");
exit(1);
}
//Do something here
int sockfd = 0;
struct sockaddr_ll sk_addr;
int sk_addr_size = sizeof(struct sockaddr_ll);
//Do something here
if((sockfd = ioctl(sockfd, SIOCGIFINDEX, htons(ETH_P_IP))) < 0){ //set sockfd
perror("socket fail");
exit(1);
}
if(mode == SEND){
send_message();
}
else if (mode == RECV){
recv_message();
}
return 0;
}
I2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CgojZGVmaW5lIEJVRl9TSVoJCTY1NTM2CiNkZWZpbmUgU0VORCAwCiNkZWZpbmUgUkVDViAxCgoKCnZvaWQgc2VuZF9tZXNzYWdlKCl7CgoJLy9EbyBzb21ldGhpbmcgaGVyZQptZW1zZXQoJnNrX2FkZHIsIDAsIHNrX2FkZHJfc2l6ZSk7IAovL3NldCBza19hZGRyIGZvciAwCnNrX2FkZHIuc2xsX2lmaW5kZXggPSBpZl9pZHguaWZyX2lmaW5kZXg7CnNrX2FkZHIuc2xsX2hhbGVuID0gRVRIX0FMRU47IAoKYnl0ZVNlbnQgPSBzZW5kdG8oc29ja2ZkLCBidWYsIEJVRl9TSVosIDAsIChzdHJ1Y3Qgc29ja2V0YWRkciopJnNrX2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKTsKcHJpbnRmKCJzdWNjZXNzIik7Cgp9Cgp2b2lkIHJlY3ZfbWVzc2FnZSgpewoKCS8vRG8gc29tZXRoaW5nIGhlcmUKbWVtc2V0KCZza19hZGRyLCAwLCBza19hZGRyX3NpemUpOwoKcmVjdkxlbiA9IHJlY3Zmcm9tKHNvY2tmZCwgYnVmLCBCVUZfU0laLCAwLCAoc3RydWN0IHNvY2thZGRyKikmc2tfYWRkciwgJnNrX2FkZHJfc2l6ZSk7CnByaW50ZigicmVjZWl2ZSAlc1xuIiwgYnVmKTsKfQovL1N1YiBmdW5jdGlvbgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJaW50IG1vZGU7CgljaGFyIGh3X2FkZHJbNl07CgljaGFyIGludGVyZmFjZU5hbWVbSUZOQU1TSVpdOwoJY2hhciBidWZbQlVGX1NJWl07CgltZW1zZXQoYnVmLCAwLCBCVUZfU0laKTsKCS8vc2V0IGJ1ZiBmb3IgMAoJCglpbnQgY29ycmVjdD0wOwoJaWYgKGFyZ2MgPiAxKXsKCQlpZihzdHJuY21wKGFyZ3ZbMV0sIlNlbmQiLCA0KT09MCl7CgkJCWlmIChhcmdjID09IDUpewoJCQkJbW9kZT1TRU5EOyAKCQkJCXNzY2FuZihhcmd2WzNdLCAiJWhoeDolaGh4OiVoaHg6JWhoeDolaGh4OiVoaHgiLCAmaHdfYWRkclswXSwgJmh3X2FkZHJbMV0sICZod19hZGRyWzJdLCAmaHdfYWRkclszXSwgJmh3X2FkZHJbNF0sICZod19hZGRyWzVdKTsKCQkJCS8vc2V0IGh3X2FkZHIKCQkJCXN0cm5jcHkoYnVmLCBhcmd2WzRdLCBCVUZfU0laKTsKCQkJCS8vc2V0IGJ1ZgoJCQkJY29ycmVjdD0xOwoJCQkJcHJpbnRmKCIgIGJ1ZjogJXNcbiIsIGJ1Zik7CgkJCX0KCQl9CgkJZWxzZSBpZihzdHJuY21wKGFyZ3ZbMV0sIlJlY3YiLCA0KT09MCl7CgkJCWlmIChhcmdjID09IDMpewoJCQkJbW9kZT1SRUNWOwoJCQkJY29ycmVjdD0xOwoJCQl9CgkJfQoJCXN0cm5jcHkoaW50ZXJmYWNlTmFtZSwgYXJndlsyXSwgSUZOQU1TSVopOyAgIC8vc2V0IGludGVyZmFjZW5hbWUgIAoJIH0gICAvL3NldCBtb2RlCgkgaWYoIWNvcnJlY3QpewoJCWZwcmludGYoc3RkZXJyLCAiLi80NTVfcHJvajIgU2VuZCA8SW50ZXJmYWNlTmFtZT4gIDxEZXN0SFdBZGRyPiA8TWVzc2FnZT5cbiIpOwoJCWZwcmludGYoc3RkZXJyLCAiLi80NTVfcHJvajIgUmVjdiA8SW50ZXJmYWNlTmFtZT5cbiIpOwoJCWV4aXQoMSk7CgkgfQoKCS8vRG8gc29tZXRoaW5nIGhlcmUKaW50IHNvY2tmZCA9IDA7CnN0cnVjdCBzb2NrYWRkcl9sbCBza19hZGRyOwppbnQgc2tfYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCk7CgovL0RvIHNvbWV0aGluZyBoZXJlCgppZigoc29ja2ZkID0gaW9jdGwoc29ja2ZkLCBTSU9DR0lGSU5ERVgsIGh0b25zKEVUSF9QX0lQKSkpIDwgMCl7IC8vc2V0IHNvY2tmZApwZXJyb3IoInNvY2tldCBmYWlsIik7CmV4aXQoMSk7Cn0KCQoKCWlmKG1vZGUgPT0gU0VORCl7CgkJc2VuZF9tZXNzYWdlKCk7Cgl9CgllbHNlIGlmIChtb2RlID09IFJFQ1YpewoJCXJlY3ZfbWVzc2FnZSgpOwoJfQoKCXJldHVybiAwOwp9
prog.cpp: In function ‘void send_message()’:
prog.cpp:20:9: error: ‘sk_addr’ was not declared in this scope
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~
prog.cpp:20:9: note: suggested alternative: ‘s6_addr’
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~
s6_addr
prog.cpp:20:21: error: ‘sk_addr_size’ was not declared in this scope
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~~~~~~
prog.cpp:20:21: note: suggested alternative: ‘sockaddr_in6’
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~~~~~~
sockaddr_in6
prog.cpp:22:23: error: ‘if_idx’ was not declared in this scope
sk_addr.sll_ifindex = if_idx.ifr_ifindex;
^~~~~~
prog.cpp:22:23: note: suggested alternative: ‘ifaddr’
sk_addr.sll_ifindex = if_idx.ifr_ifindex;
^~~~~~
ifaddr
prog.cpp:25:1: error: ‘byteSent’ was not declared in this scope
byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
^~~~~~~~
prog.cpp:25:19: error: ‘sockfd’ was not declared in this scope
byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
^~~~~~
prog.cpp:25:19: note: suggested alternative: ‘socket’
byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
^~~~~~
socket
prog.cpp:25:27: error: ‘buf’ was not declared in this scope
byteSent = sendto(sockfd, buf, BUF_SIZ, 0, (struct socketaddr*)&sk_addr, sizeof(struct sockaddr_ll));
^~~
prog.cpp: In function ‘void recv_message()’:
prog.cpp:33:9: error: ‘sk_addr’ was not declared in this scope
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~
prog.cpp:33:9: note: suggested alternative: ‘s6_addr’
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~
s6_addr
prog.cpp:33:21: error: ‘sk_addr_size’ was not declared in this scope
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~~~~~~
prog.cpp:33:21: note: suggested alternative: ‘sockaddr_in6’
memset(&sk_addr, 0, sk_addr_size);
^~~~~~~~~~~~
sockaddr_in6
prog.cpp:35:1: error: ‘recvLen’ was not declared in this scope
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
^~~~~~~
prog.cpp:35:1: note: suggested alternative: ‘recvmsg’
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
^~~~~~~
recvmsg
prog.cpp:35:20: error: ‘sockfd’ was not declared in this scope
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
^~~~~~
prog.cpp:35:20: note: suggested alternative: ‘socket’
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
^~~~~~
socket
prog.cpp:35:28: error: ‘buf’ was not declared in this scope
recvLen = recvfrom(sockfd, buf, BUF_SIZ, 0, (struct sockaddr*)&sk_addr, &sk_addr_size);
^~~