| 1207 | } |
| 1208 | |
| 1209 | static int create_socket(struct sockaddr_storage* media_sa, int try_port, bool last_attempt, |
| 1210 | const char *type) |
| 1211 | { |
| 1212 | int s = socket(media_sa->ss_family, SOCK_DGRAM, IPPROTO_UDP); |
| 1213 | if (s == -1) { |
| 1214 | ERROR_NO("Unable to create the %s RTP socket", type); |
| 1215 | } |
| 1216 | |
| 1217 | if (media_sa->ss_family == AF_INET) { |
| 1218 | (_RCAST(struct sockaddr_in*, media_sa))->sin_port = htons(try_port); |
| 1219 | } else { |
| 1220 | (_RCAST(struct sockaddr_in6*, media_sa))->sin6_port = htons(try_port); |
| 1221 | } |
| 1222 | |
| 1223 | if (::bind(s, (sockaddr*)media_sa, socklen_from_addr(media_sa)) != 0) { |
| 1224 | if (last_attempt) { |
| 1225 | ERROR_NO("Unable to bind %s RTP socket (IP=%s, port=%d)", type, media_ip, try_port); |
| 1226 | } |
| 1227 | ::close(s); |
| 1228 | return -1; |
| 1229 | } |
| 1230 | return s; |
| 1231 | } |
| 1232 | |
| 1233 | /** |
| 1234 | * Create and bind media_socket_audio, media_socket_video for RTP and |
no test coverage detected