I think your understanding of timeout was reversed. Here is the quote from the author's doc "If the timeout value is negative, the send operation will not use a timeout." So to do what you planed, you will need to use a positive value. And you can implement to resend logic in the timeout callback method:
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError *)error;