Mercurial > hg > audiostuff
comparison intercom/udp.cpp @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:9cadc470e3da | 2:13be24d74cd2 |
---|---|
1 /* udp.cpp | |
2 * | |
3 * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). | |
4 * All Rights Reserved. | |
5 * | |
6 * UDP functions for IPv4 | |
7 * Multicast Doc: /usr/share/doc/howto/en/html/Multicast-HOWTO.html | |
8 * | |
9 * Version 0.2 | |
10 */ | |
11 | |
12 #include <stdio.h> | |
13 #include <stdlib.h> | |
14 #include <string.h> | |
15 | |
16 /* Socket io */ | |
17 #include <sys/types.h> | |
18 #include <sys/socket.h> | |
19 #include <netinet/in.h> | |
20 #include <netdb.h> | |
21 #include <sys/time.h> | |
22 #include <unistd.h> | |
23 #include <sys/errno.h> | |
24 #include <assert.h> | |
25 | |
26 #include "udp.h" | |
27 #include "intercomd.h" | |
28 | |
29 int UDP_recv_init(int port) | |
30 /* starte UDP LAN Empfang. Programm-Exit bei Fehler! */ | |
31 /* return: Filedescriptor fuer Empfang */ | |
32 /* in port: UDP Port Nummer */ | |
33 { | |
34 int fd; | |
35 struct sockaddr_in sock; | |
36 int local_flag; | |
37 socklen_t local_flagsize; | |
38 | |
39 /* init UDP local1 */ | |
40 fd = socket(AF_INET, SOCK_DGRAM, 0); | |
41 if (fd < 0) { | |
42 fprintf(stderr, "if_recv_init(): socket() failed\n"); | |
43 exit(1); | |
44 } | |
45 | |
46 memset((char *) &sock, 0, sizeof(sock)); | |
47 sock.sin_family = AF_INET; | |
48 sock.sin_addr.s_addr = htonl(INADDR_ANY); | |
49 sock.sin_port = htons(port); | |
50 if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) < 0) { | |
51 fprintf(stderr, "if_recv_init(): bind() failed\n"); | |
52 exit(2); | |
53 } | |
54 local_flagsize = sizeof(int); | |
55 if (getsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *) &local_flag, | |
56 &local_flagsize) < 0) { | |
57 fprintf(stderr, "if_recv_init(): getsockopt() failed\n"); | |
58 exit(3); | |
59 } | |
60 /* printf("SO_RCVBUF=%d\n", local_flag); */ | |
61 | |
62 /* printf("init socket\n"); */ | |
63 return fd; | |
64 } | |
65 | |
66 void UDP::send_init(char *foreign_name, int foreign_port, int local_fd_) | |
67 /* Starte Versand von UDP Meldungen auf LAN */ | |
68 /* in foreign_name: IP-Adresse auf die gesendet wird */ | |
69 /* in foreign_port: UDP-Port auf den gesendet wird */ | |
70 { | |
71 struct hostent *foreign_host; | |
72 int local_flag; | |
73 socklen_t local_flagsize; | |
74 | |
75 local_fd = local_fd_; | |
76 | |
77 /* turn on broadcast */ | |
78 local_flagsize = sizeof(int); | |
79 if (getsockopt(local_fd, SOL_SOCKET, SO_BROADCAST, | |
80 (char *) &local_flag, &local_flagsize) < 0) { | |
81 fprintf(stderr, "udp_send_init(): getsockopt() failed\n"); | |
82 exit(3); | |
83 } | |
84 if (local_flag == 0) { | |
85 local_flag = 1; | |
86 setsockopt(local_fd, SOL_SOCKET, SO_BROADCAST, (char *) &local_flag, | |
87 sizeof(int)); | |
88 local_flagsize = sizeof(int); | |
89 if (getsockopt(local_fd, SOL_SOCKET, SO_BROADCAST, | |
90 (char *) &local_flag, &local_flagsize) < 0) { | |
91 fprintf(stderr, "udp_send_init() SO_BROADCAST failed\n"); | |
92 exit(3); | |
93 } | |
94 } | |
95 | |
96 /* init foreign part */ | |
97 memset((char *) &foreign_sock, 0, sizeof(foreign_sock)); | |
98 | |
99 foreign_host = gethostbyname(foreign_name); | |
100 if (foreign_host == NULL || foreign_host->h_length == 0) { | |
101 fprintf(stderr, "udp_send_init(): gethostbyname() failed"); | |
102 exit(1); | |
103 } | |
104 memcpy(&foreign_sock.sin_addr.s_addr, foreign_host->h_addr_list[0], | |
105 foreign_host->h_length); | |
106 foreign_sock.sin_family = AF_INET; | |
107 foreign_sock.sin_port = htons(foreign_port); | |
108 | |
109 | |
110 in_addr_t to_ip = ntohl(foreign_sock.sin_addr.s_addr); | |
111 char s[20]; | |
112 print_gui("c %s\n", iptoa(s, to_ip)); | |
113 } | |
114 | |
115 void UDP::send(char *buf, int bytes) | |
116 /* Sende UDP Meldung auf LAN */ | |
117 /* in buf: Meldung */ | |
118 /* in bytes: Laenge der Meldung */ | |
119 { | |
120 int len; | |
121 | |
122 len = sendto(local_fd, | |
123 buf, bytes, | |
124 0, (struct sockaddr *) &foreign_sock, sizeof(foreign_sock)); | |
125 if (len != bytes) { | |
126 fprintf(stderr, "udp_send(): sendto() foreign failed ret=%d\n", | |
127 len); | |
128 } | |
129 } | |
130 | |
131 void UDP::send_close() | |
132 { | |
133 memset((char *) &foreign_sock, 0, sizeof(foreign_sock)); | |
134 } | |
135 | |
136 // IP to ASCII | |
137 char *iptoa(char *buf, in_addr_t ip) | |
138 { | |
139 int i1 = ip >> 24; | |
140 int i2 = (ip >> 16) & 0xFF; | |
141 int i3 = (ip >> 8) & 0xFF; | |
142 int i4 = ip & 0xFF; | |
143 | |
144 sprintf(buf, "%d.%d.%d.%d", i1, i2, i3, i4); | |
145 | |
146 return buf; | |
147 } | |
148 | |
149 // ASCII to IP | |
150 in_addr_t atoip(char *buf) | |
151 { | |
152 int i1, i2, i3, i4; | |
153 | |
154 sscanf(buf, "%d.%d.%d.%d", &i1, &i2, &i3, &i4); | |
155 | |
156 return i1 << 24 | i2 << 16 | i3 << 8 | i4; | |
157 } |