cisco / libsrtp

Library for SRTP (Secure Realtime Transport Protocol)
Other
1.19k stars 472 forks source link

Address already in use for receiving multicast stream from pthreads concurrently. #582

Closed snowuyl closed 2 years ago

snowuyl commented 2 years ago

I have changed rtpw.c to receive multicast stream from pthreads concurrently. But

int main(int argc, char argv[]) { ... / creating threads */ srtp_receiver_t receiver_arg; receiver_arg.address = address; receiver_arg.key = key; receiver_arg.input_key = input_key; receiver_arg.port = port; receiver_arg.sec_servs = sec_servs; receiver_arg.gcm_on = gcm_on; receiver_arg.key_size = key_size; receiver_arg.tag_size = tag_size; receiver_arg.b64_input = b64_input; receiver_arg.ssrc = ssrc;

for (int i = 0; i < CHANNEL_NUM; i++) {
    pthread_create(&tid[i], NULL, srtp_receiver, &receiver_arg);
}

/* waiting threads finish */ 
for (int i = 0; i < CHANNEL_NUM; i++)
   pthread_join(tid[i], NULL);

return 0;

}

Server: PEER_V=20000 PEER_IP=224.1.1.1 \ SELF_PATH="/home/snowuyl/Videos/1080p_30fps_217s.ts" \ SELF_VSSRC=0xdeadbeef \ SELF_KEY="4142434445464748494A4B4C4D4E4F505152535455565758595A31323334" \ bash -c 'gst-launch-1.0 -e \ uridecodebin uri="file://$SELF_PATH" \ ! videoconvert \ ! x264enc tune=zerolatency \ ! rtph264pay \ ! "application/x-rtp,payload=(int)103,ssrc=(uint)$SELF_VSSRC" \ ! srtpenc key="$SELF_KEY" \ rtp-cipher="aes-128-icm" rtp-auth="hmac-sha1-80" \ rtcp-cipher="aes-128-icm" rtcp-auth="hmac-sha1-80" \ ! udpsink host=$PEER_IP auto-multicast=true port=$PEER_V'

Client: ./rtpw -k $key -a -e 128 -r 224.1.1.1 20000 Using libsrtp2 2.5.0 [0x2050000] MAX_WORD_LEN=2048 security services: confidentiality message authenticationsecurity services: confidentiality message authentication set master key/salt to 4142434445464748494a4b4c4d4e4f50/5152535455565758595a31323334 security services: confidentiality message authentication

security services: security services: confidentiality set master key/salt to 4142434445464748494a4b4c4d4e4f50/security se4 security services: security services: security services: confidentiality message authentication set master key/salt to 4142434445464748494a4b4c4d4e4f50/security services: 5152535455565758595a31323334 socket bind error security services: confidentiality message authenticationconfidentiality security services: confidentiality message authentication Address already in use security services: confidentiality message authentication rtpw: Failed to leave multicast groupBad file descriptor set master key/salt to 4142434445464748494a4b4c4d4e4f50/security services: 5152535455565758595a31323334 socket bind error cAddress already in use

snowuyl commented 2 years ago

I have fixed this issue by adding SO_REUSEADDR to socket option. { int reuse=1;

if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
               (char *)&reuse, sizeof(reuse)) < 0) {
  perror("setting SO_REUSEADDR");
  close(sd);
  exit(1);
}

}