RTSP调试代码 (二)

2014-11-23 22:57:57 · 作者: · 浏览: 19
将sock加入到要等待的队列; FD_SET(sc1, &rfdsock ); FD_SET(sc2, &rfdsock); lret = GetSokcetPort(sc1, &ip1); lret = GetSokcetPort(sc2, &ip2); //发送Setup命令,告诉服务器客户端的接受数据的端口; szcmd = GetSetupCmd(url, ip1, ip2); //告诉服务器客户端的端口; lret = SendRTSPCmd(sockin, "SETUP", szcmd); free(szcmd); lret = ReadSocket(sockin, buf, nlen, 100); //解析Response返回的命令串; char szip2[9]; lret = PraseSetupCmd(buf, szip2); char *session, *srange; session = szip2; //发送PLAY命令 srange = "Range: npt=0.000-39.471\r\n"; szcmd = GetPlayCmd(url, session, srange); lret = SendRTSPCmd(sockin, "PLAY", szcmd); free(szcmd); lret = ReadSocket(sockin, buf, nlen, 100); timeva l tv; fd_set fr; int i; tv.tv_sec = 20; tv.tv_usec = 0; struct sockaddr_in addr2; int addrlen; addrlen = sizeof addr; //将数据写到文件中去; FILE *ffp; ffp = fopen("bipbop-gear1-all.ts", "w+"); //开始接受数据了; while(true) { fr = rfdsock; lret = select(0, &fr, NULL, NULL, &tv); if(lret == SOCKET_ERROR) { break; } else if(lret >0) { //判断是哪个socket可以读取数据了 for(i = 0; i< 2;i ++) { if(FD_ISSET(rfdsock.fd_array[i], &fr) && FD_ISSET(rfdsock.fd_array[i], &rfdsock)) { lret = recvfrom(rfdsock.fd_array[i], buf, nlen,0, (struct sockaddr*)&addr2, &addrlen ); if(lret > 0 && ffp) { fwrite(buf, 1, lret, ffp); } else if(lret == SOCKET_ERROR) { break; } } } } else if(lret == 0) break; } fclose(ffp); //退出后的清理工作 closesocket(sockin); closesocket(sc1); closesocket(sc2); fwrite("\r\nend", 1, 5, fp); fclose(fp); return 0; } long InitSocket()
{ WSADATA ws; long lret = -1; lret = WSAStartup(MAKEWORD(2,2), &ws); return 0; } long DeInitSocket() { WSACleanup(); return 0; } long InitTCPSocket( int port ) { long lret ; int sock; sockaddr_in addr; sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //int flag = 1; //lret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&flag, sizeof flag); //addr.sin_family = AF_INET; //addr.sin_port = 0; //addr.sin_addr.s_addr = INADDR_ANY; //lret = bind(sock, (struct sockaddr*)&addr, sizeof addr); lret = sock; return lret; } #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) #define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2) #define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3) #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) #define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5) #define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6) #define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8) #define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9) #define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11) long InitUDPSocket(const char *ip, int port ) { long lret; int sock; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); int flag = 1; lret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&flag, sizeof flag); sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = port; if(ip) addr.sin_addr.s_addr = inet_addr(ip); else addr.sin_addr.s_addr = INADDR_ANY; lret = bind(sock, (struct sockaddr*)&addr, sizeof addr); //设置非堵塞通讯 //u_long arg = 2; //lret = ioctlsocket(sock, SIO_LIMIT_BROADCASTS, &arg); lret = sock; return lret; } long GetSokcetPort( int sock, int *port ) { long lret = -1; sockaddr_in addr; int nlen; nlen = sizeof addr; addr.sin_port = 0; *port = 0; if(getsockname(sock, (struct s