RTSP调试代码 (二)
将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