Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <pcap.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <pthread.h>
- #include <unistd.h>
- #include "nbns.h"
- char running = 1;
- pcap_t *handle;
- void *sender(void *arg) {
- int sockfd;
- struct sockaddr_in addr;
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- memset(&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_port = htons(137);
- addr.sin_addr.s_addr = htonl(0xC0A80001); // 192.168.0.1
- connect(sockfd, (struct sockaddr *) &addr, sizeof(addr));
- while(running) {
- write(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN);
- usleep(10);
- }
- sendto(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN, 0, (struct sockaddr *) &addr, sizeof(addr));
- return NULL;
- }
- void stop(int signal) {
- //pcap_breakloop(handle);
- running = 0;
- }
- void pcap_callback(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) {
- if(!running) {
- pcap_breakloop(handle);
- }
- }
- void *receiver(void *arg) {
- int ret;
- struct bpf_program filter;
- char err_buff[PCAP_ERRBUF_SIZE];
- handle = pcap_open_live((char *) arg, 0x40000, 0, 1000, err_buff);
- if(!handle) {
- fprintf(stderr, "pcap_open_live: %s", err_buff);
- running = 0;
- return NULL;
- }
- if(pcap_compile(handle, &filter, "udp and port 137", 1, 0xffffff00)) {
- fprintf( stderr, "pcap_compile: %s", pcap_geterr(handle));
- pcap_close(handle);
- running = 0;
- return NULL;
- }
- if(pcap_setfilter(handle, &filter)) {
- fprintf( stderr, "pcap_setfilter: %s", pcap_geterr(handle));
- pcap_close(handle);
- running = 0;
- return NULL;
- }
- ret = pcap_loop(handle, -1, pcap_callback, NULL);
- return (void *) ret;
- }
- int main(int argc, char **argv) {
- pthread_t tid;
- int ret;
- if(argc != 2) return 1;
- if(signal(SIGINT, stop) == SIG_ERR) return 2;
- if(pthread_create(&tid, NULL, receiver, (void *) argv[1])) {
- pcap_close(handle);
- return 6;
- }
- sender(NULL);
- running=0;
- pthread_join(tid, (void **) &ret);
- if(ret == -1) {
- fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(handle));
- return 7;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement