#include #include "rudp_punch.h" /* * \param local_port * Local port the socket will bind to(but not listen on). * \param listening_peer * The address the other side listening on, may be NULL. * \param candidate_peers, n_peer * The possible addresses the other side can be reached by. */ RUDPSOCKET RUDPPunch(unsigned short local_port, const struct sockaddr *listening_peer, const struct sockaddr_in *candidate_peers, int n_peer, CHECKCONNECTIONCB cb, void *cb_data) { #define MAX_CANDIDATES 10 RUDPSOCKET rsock_c = INVALID_RUDPSOCKET, rsocks[MAX_CANDIDATES]; RUDPSOCKCHNO rset[MAX_CANDIDATES], wset[MAX_CANDIDATES], eset[MAX_CANDIDATES]; int n_rset, n_wset, n_eset, nr, nw, ne; struct timeval tv; struct sockaddr_in sai; int i, opt; if(n_peer > 9) n_peer = 9; if(listening_peer) n_peer++; memset(&sai, 0, sizeof(sai)); sai.sin_family = AF_INET; sai.sin_port = htons(local_port); opt = 1; n_rset = n_wset = n_eset = 0; for(i=0; ilength), 0) < 0) break; return CHECKCONNECTION_CONTINUE; case CONNSTATUS_READABLE: len = RUDPRecv(s, 0, &chno, &dp, sizeof(dp)); if(len >= sizeof(struct dcs_header) && check_dcs_header(&dp.dh) && dp.dh.cls == CLS_RESPONSE && dp.dh.st == ST_IPCAM) return(dp.dh.status == 0)?CHECKCONNECTION_OK:-dp.dh.status; else return -1000; break; } return CHECKCONNECTION_CONTINUE; } int _CameraPunchCb(RUDPSOCKET s, int status, void *data) { int len; struct dcs_punch dp; switch(status) { case CONNSTATUS_CONNECTED: ;//if this is client, send confirmation break; case CONNSTATUS_ACCEPTED: ;//send confirmation break; case CONNSTATUS_READABLE: len = RUDPRecv(s, &chno, &dp, sizeof(dp)); if(len >= sizeof(struct dcs_header) && check_dcs_header(&dp.dh) && dp.dh.cls == CLS_REQUEST && dp.dh.st == ST_CLT) { ;//check session and password } break; } return CHECKCONNECTION_CONTINUE; } int main() { return 0; }