Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <netdb.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdlib.h>
- #include <string.h>
- #define BUFF_SIZE 255
- void error (char *err_msg) {
- perror(err_msg);
- exit(1);
- }
- int main (int argc, char **argv) {
- struct sockaddr_in my_addr;
- struct sockaddr_in their_addr;
- struct addrinfo hints, *res;
- char rcv_buf[BUFF_SIZE], send_buf[BUFF_SIZE], addrstr[BUFF_SIZE];
- int sockfd, ch, Pflag = 0, port = 1234;
- socklen_t addr_len = sizeof(struct sockaddr);
- int rcv_len;
- int IPv4flag, IPv6flag;
- int i = 0;
- unsigned int *paddr;
- if (argc != 1 && argc != 3)
- error("Usage: ./udpserver [-p port]");
- while ((ch = getopt(argc, argv, "p")) != -1){
- switch(ch){
- case 'p':
- Pflag = 1;
- break;
- default:
- error("Usage: ./udpserver [-p port]");
- break;
- }
- }
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sockfd < 0)
- error("Problem s otvaranjem socketa");
- memset(&my_addr, 0, sizeof(my_addr));
- my_addr.sin_family = AF_INET;
- my_addr.sin_addr.s_addr = INADDR_ANY;
- if (Pflag) {
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = AF_INET;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_flags = AI_PASSIVE;
- if (getaddrinfo(NULL, argv[2], &hints, &res) < 0)
- error("Problem s getaddrinfo()");
- my_addr.sin_port = ((struct sockaddr_in *)res->ai_addr)->sin_port;
- }
- else {
- my_addr.sin_port = htons(port);
- }
- if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0)
- error("Problem s bindanjem socketa");
- while (1) {
- IPv4flag = IPv6flag = 0;
- if ((rcv_len = recvfrom (sockfd, rcv_buf, BUFF_SIZE, 0,
- (struct sockaddr *)&their_addr, &addr_len)) < 0)
- error("Problem s primanjem datagrama");
- if (rcv_len == 0) {
- return 0;
- } else {
- printf("%s\n", rcv_buf);
- // Brojac za duljinu adrese
- int rcv_buf_addr_len = 0;
- for (i = 2; i < rcv_len; i++) {
- if(rcv_buf[i] == '\n') break;
- rcv_buf_addr_len++;
- }
- char address[rcv_buf_addr_len];
- for(i = 0; i < rcv_buf_addr_len; i++) {
- address[i] = rcv_buf[i+2];
- }
- if (rcv_buf[1] == '4') IPv4flag = 1;
- if (rcv_buf[1] == '6') IPv6flag = 1;
- memset(&hints, 0, sizeof(hints));
- if (IPv4flag) {
- hints.ai_family = AF_INET;
- }
- if (IPv6flag) {
- hints.ai_family = AF_INET6;
- }
- hints.ai_flags |= AI_CANONNAME;
- if (getaddrinfo(address, NULL, &hints, &res) < 0)
- error("Problem s getaddrinfo()");;
- memset(send_buf, 0, BUFF_SIZE);
- memset(addrstr, 0, BUFF_SIZE);
- if (rcv_buf[0] == 'S') {
- if (IPv4flag)
- inet_ntop(res->ai_family, &((struct sockaddr_in *)res->ai_addr)->sin_addr,
- addrstr, BUFF_SIZE);
- if (IPv6flag)
- inet_ntop(res->ai_family, &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr,
- addrstr, BUFF_SIZE);
- strncpy(send_buf, "\x02", 1);
- strncpy(send_buf + 1, addrstr, sizeof(addrstr));
- }
- if (rcv_buf[0] == 'N') {
- strncpy(send_buf, "\x01", 1);
- if (IPv4flag) {
- struct sockaddr_in *p = (struct sockaddr_in *)
- (res->ai_addr);
- paddr = &(p->sin_addr.s_addr);
- memcpy(addrstr, paddr, 4);
- strncpy(send_buf + 1, addrstr, sizeof(addrstr));
- }
- if (IPv6flag) {
- struct sockaddr_in6 *p = (struct sockaddr_in6 *)
- (res->ai_addr);
- sprintf(addrstr, "%s", p->sin6_addr.s6_addr);
- strncpy(send_buf + 1, addrstr, sizeof(addrstr));
- }
- }
- if (sendto(sockfd, send_buf, strlen(send_buf) + 1, 0,
- (struct sockaddr *)&their_addr, addr_len) < 0)
- error("Problem s slanjem datagrama");
- }
- }
- freeaddrinfo(res);
- close(sockfd);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement