-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRTSPClient.cpp
188 lines (148 loc) · 4.99 KB
/
RTSPClient.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <sys/wait.h>
#include "liveMedia.hh"
#define MAX_MESSAGE_LEN 512
#define SERVER_ADDR_LEN 128
#define MAX_FILE_NAME_LEN 256
#define MAX_FILE_LIST_SIZE 256
int createAndSetSocket(char *addr, int port, struct sockaddr_in *server_addr_p) {
int sockfd;
memset(server_addr_p, 0, sizeof(*server_addr_p));
server_addr_p->sin_family = AF_INET;
server_addr_p->sin_port = htons(port);
server_addr_p->sin_addr.s_addr = inet_addr(addr);
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Error: Socket creating failed");
return -1;
}
return sockfd;
}
int receiveFromServer(int sockfd, struct sockaddr_in *server_addr_p, char *buf, int buf_len) {
socklen_t server_addr_size = sizeof(*server_addr_p);
int recv_size;
if((recv_size = recvfrom(sockfd, buf, buf_len, 0, (struct sockaddr*)server_addr_p, &server_addr_size)) < 0) {
perror("Error: Message receiving failed");
return -1;
}
return recv_size;
}
int sendToServer(int sockfd, struct sockaddr_in *server_addr_p, char *buf, int buf_len) {
int send_size;
if((send_size = sendto(sockfd, buf, buf_len, 0, (struct sockaddr*)server_addr_p, sizeof(*server_addr_p))) < 0) {
perror("Error: Message sending failed");
return -1;
}
return send_size;
}
char *getVideoFileNameFromUser(char *filename, char *list) {
char *filename_list[MAX_FILE_LIST_SIZE];
char *cur = list;
int file_cnt = 0;
int select;
int i;
do {
filename_list[file_cnt] = cur;
cur = strchr(cur, '\n');
if(cur != NULL) {
*cur = '\0';
cur++;
file_cnt++;
}
} while(cur != NULL);
if(file_cnt == 0) {
perror("Error: Empty file list");
return NULL;
}
printf("\n=============== Video List ===============\n");
for(i = 0; i < file_cnt; i++)
printf(" %d) %s\n", i+1, filename_list[i]);
do {
printf(" - Choose number: ");
scanf("%d", &select);
} while(select < 1 || select > file_cnt);
printf("==========================================\n\n");
strcpy(filename, filename_list[select-1]);
return filename;
}
int main(int argc, char** argv) {
int socketDescriptor;
char serverAddress[SERVER_ADDR_LEN];
int port;
struct sockaddr_in serverAddr;
char message[MAX_MESSAGE_LEN];
char fileName[MAX_FILE_NAME_LEN];
char rtspURL[MAX_FILE_NAME_LEN];
if(argc != 3) {
printf("Usage: %s [server address] [port]\n", argv[0]);
exit(1);
}
strcpy(serverAddress, argv[1]);
port = atoi(argv[2]);
if((socketDescriptor = createAndSetSocket(serverAddress, port, &serverAddr)) == -1) {
perror("Error: Socket failed");
exit(1);
}
printf("Hello to server %s:%d...\n", serverAddress, port);
if(sendToServer(socketDescriptor, &serverAddr, (char*)"Hello server.", 14) == -1) {
perror("Error: Hello message sending failed");
exit(1);
}
if(receiveFromServer(socketDescriptor, &serverAddr, message, sizeof(message)) == -1) {
perror("Error: Hello message receiving failed");
exit(1);
}
printf("Server: %s\n", message);
printf("Requesting video list...\n");
if(sendToServer(socketDescriptor, &serverAddr, (char*)"Request video list", 19) == -1) {
perror("Error: Video list request message sending failed");
exit(1);
}
if(receiveFromServer(socketDescriptor, &serverAddr, message, sizeof(message)) == -1) {
perror("Error: Video list receiving failed");
exit(1);
}
if(strcmp(message, "Empty") == 0) {
fprintf(stderr, "Error: No video file exist\n");
exit(1);
}
if(getVideoFileNameFromUser(fileName, message) == NULL) {
perror("Error: Video selecting failed");
exit(1);
}
printf("Requesting video %s...\n", fileName);
strcpy(message, "Request ");
strcat(message, fileName);
if(sendToServer(socketDescriptor, &serverAddr, message, strlen(message)+1) == -1) {
perror("Error: Video request message sending failed");
exit(1);
}
if(receiveFromServer(socketDescriptor, &serverAddr, message, sizeof(message)) == -1) {
perror("Error: Streaming initializing failed");
exit(1);
}
if(strncmp(message, "Streaming ", 10) != 0) {
fprintf(stderr, "Error: Streaming file not available on server\n");
exit(1);
}
close(socketDescriptor);
printf("Streaming video...\n");
strcpy(rtspURL, "rtsp://");
strcat(rtspURL, serverAddress);
strcat(rtspURL, ":8554/videoStream");
if(fork() == 0) {
char *argv[] = {(char*)"./RTSPReceiver", NULL, NULL};
argv[1] = rtspURL;
execv("./RTSPReceiver", argv);
} else {
wait(NULL);
printf("Streaming complete.\n");
}
return 0;
}