extern "C" {
#include "udpMediaService.h"
}
#include <windows.h>
#include <string>
#include <vector>
#include <time.h>
using namespace std;
bool FindOrCreateDirectory( const char* pszPath )
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile( pszPath, &fd );
while( hFind != INVALID_HANDLE_VALUE )
{
if ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
return true;
}
if ( !::CreateDirectory( pszPath, NULL ) )
{
//char szDir[MAX_PATH];
//sprintf_s( szDir, sizeof(szDir), "创建目录[%s]失败,请检查权限", pszPath );
//Output("the error is %s", szDir);
//return false;
}
return true;
}
// 遍历目录
bool CheckDirectory( char* pszPath )
{
vector< std::string > vtPath;
const char* sep = "\\/";
char* next_token;
char* token = strtok_s( pszPath, sep, &next_token);
while( token != NULL )
{
vtPath.push_back( token );
token = strtok_s(NULL, sep, &next_token);
}
if ( vtPath.size() > 0 )
{
if ( vtPath[0] == "." )
vtPath.erase( vtPath.begin() );
}
// 核查所有路径是否存在
std::string strCurPath;
for( size_t i = 0; i < (int)vtPath.size(); ++i )
{
strCurPath += vtPath[i];
strCurPath += ‘\\‘;
if ( !FindOrCreateDirectory( strCurPath.c_str() ) )
{
return false;
}
}
return true;
}
DWORD WINAPI mediaRecvPthread(LPVOID pM)
{
char buffer[BUFFER_SIZE] = {0};
int mediaRecvLen = -1;
int mediaRecvStatus = 1;
char mediaPath[128] = {0};
int err;
BOOL bDontLinger = FALSE;
BOOL bReuseaddr = TRUE;
int nNetTimeout = TIME; //阻塞
int recvAddrLen = 0;
char localip[20];
char filePath[128] = {0};
MEDIAPATH *mediaValue = (MEDIAPATH *)pM;
int port = atoi(mediaValue->mediaValue);
memcpy(filePath, mediaValue->filePath, sizeof(mediaValue->filePath));
//unsigned long ul = 1;
SOCKET mediaRecvSock;
struct sockaddr_in mediaRecvAddr;
struct sockaddr_in mediaRecvFromAddr;
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
printf("port is %d.\n", port);
printf("filePath is %s.\n", filePath);
mediaRecvSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//if (SOCKET_ERROR == ioctlsocket(recvSocket, FIONBIO, (unsigned long *)&ul)) //设置成非阻塞函数
//{
// printf("ioctlsocket fiald\n");
// return -1;
//}
memset(&mediaRecvAddr, 0, sizeof(recvAddr));
mediaRecvAddr.sin_family = AF_INET;
mediaRecvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//mediaRecvAddr.sin_addr.S_un.S_addr = inet_addr(SERVERIP);
mediaRecvAddr.sin_port = htons(port);
recvAddrLen = sizeof(mediaRecvAddr);
if (0 != bind(mediaRecvSock, (SOCKADDR *)&mediaRecvAddr, recvAddrLen))
{
printf("mediaRecvInit Bind filed!\n");
return -1;
}
setsockopt(mediaRecvSock, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(BOOL));
setsockopt(mediaRecvSock, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL));
setsockopt(mediaRecvSock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nNetTimeout, sizeof(BOOL));
FILE *mediaFp = fopen(filePath, "wb");
while(mediaRecvStatus)
{
mediaRecvLen = recvfrom(mediaRecvSock, buffer, sizeof(buffer), 0, (SOCKADDR *)&mediaRecvFromAddr, &recvAddrLen);
if (mediaRecvLen = SOCKET_ERROR)
{
err = WSAGetLastError();
if (err == WSAEWOULDBLOCK)
{
continue;
}
else if (err == WSAETIMEDOUT) //超时
{
printf("recv timeout\n");
break;
}
else if (err == WSAENETDOWN) //连接断开
{
printf("recv connection break\n");
break;
}
else //其他错误
printf("other error\n");
break;
}
else
{
fwrite(buffer, sizeof(char), mediaRecvLen, mediaFp);
}
}
fclose(mediaFp);
closesocket(mediaRecvSock);
WSACleanup();
return 0;
}
//XXX:使用带头结点的单向链表 存放用户信息
int memoryError(USERINFO *p) //判断内存是否申请成功
{
if (p == NULL) {
printf("MEMORY ERROR!");
return 1;
}
return 0;
}
int creatUserList(USERINFO *head) {
if (memoryError(head))
return -1;
head->next = NULL;
}
int addUser(USERINFO *head, MEDIAINFO data) //始终在表头插入
{
USERINFO * new_create = (USERINFO *)malloc(sizeof(USERINFO));
if (memoryError(new_create))
return -1;
new_create->mediaInfo = data;
new_create->next = head->next;
head->next = new_create;
}
int delUser(USERINFO *head, char name[10]) {
USERINFO *q = head;
USERINFO *p = head->next;
while (p != NULL) {
if (strcmp((p->mediaInfo).uid, name) == 0)
break;
q = p;
p = p->next;
}
if (p == NULL) {
printf("删除用户失败\n");
return -1;
}
q->next = p->next;
free(p);
p = NULL;
}
int findUser(USERINFO *head, char name[10]) {
USERINFO *p = head->next;
while (p != NULL) {
if (strcmp((p->mediaInfo).uid, name) == 0)
return 0;
p = p->next;
}
if (p == NULL)
return -1;
}
int getMediaPort()
{
SOCKET s;
int port;
struct sockaddr_in addr;
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
for(port = 5500; port < 65535; port++)
{
addr.sin_port = htons(port);
if (0 == bind(s, (struct sockaddr *)&addr, sizeof(addr)))
{
break;
}
}
closesocket(s);
return port != 65535 ? port : -1;
}
int getNowTime(char *nowTime)
{
char acYear[5] = {0};
char acMonth[5] = {0};
char acDay[5] = {0};
char acHour[5] = {0};
char acMin[5] = {0};
char acSec[5] = {0};
time_t now;
struct tm* timenow;
time(&now);
timenow = localtime(&now);
strftime(acYear,sizeof(acYear),"%Y",timenow);
strftime(acMonth,sizeof(acMonth),"%m",timenow);
strftime(acDay,sizeof(acDay),"%d",timenow);
strftime(acHour,sizeof(acHour),"%H",timenow);
strftime(acMin,sizeof(acMin),"%M",timenow);
strftime(acSec,sizeof(acSec),"%S",timenow);
strncat(nowTime, acYear, 4);
strncat(nowTime, acMonth, 2);
strncat(nowTime, acDay, 2);
strncat(nowTime, acHour, 2);
strncat(nowTime, acMin, 2);
strncat(nowTime, acSec, 2);
return 0;
}
int changeStr(const char *str1, const char *str2, const char *str3, const char *str4, char *outstr)
{
strncat(outstr, str1, strlen(str1));
strncat(outstr, "//", 2);
strncat(outstr, str2, strlen(str2));
strncat(outstr, str3, strlen(str3));
strncat(outstr, str4, strlen(str4));
return 0;
}
//DWORD WINAPI ThreadFun(LPVOID pM)
//{
// printf("子线程ID号为:%d\n", GetCurrentThreadId());
// return 0;
//}
int mediaRecvPthreadInit(MEDIAPATH *mediaValue)
{
HANDLE mediaRecvHandle = NULL;
mediaRecvHandle = CreateThread(NULL, 0, mediaRecvPthread, mediaValue, 0, NULL);
if (NULL == mediaRecvHandle)
{
printf("Create Thread mediaRecvPthread error\n");
return -1;
}
else
{
printf("Create Thread mediaRecvPthread successfully\n");
//WaitForSingleObject(mediaRecvHandle, INFINITE);
WaitForSingleObject(mediaRecvHandle, 50);
}
return 0;
//WaitForMultipleObjects(THREAD_NUM, (const HANDLE *)mediaRecvHandle, TRUE, INFINITE);
}
//static void filesearch(char const* path)
//{
// struct _finddata_t filefind;
// String curr = String(path) + "\\*.*";
// char tmp[128] = {0};
// char video_path[64] = {0};
// int done = 0, i, handle, j = 0, ret = -1, count = 0;
// char filename[50][32] = {0};
// if((handle=_findfirst(curr.c_str(),&filefind))==-1)return;
// while(!(done=_findnext(handle,&filefind)))
// {
// if(!strcmp(filefind.name,".."))continue;
// if ((_A_SUBDIR==filefind.attrib))
// {
// //cout<<filefind.name<<"(dir)"<<endl;
// curr=String(path) + "\\";
// filesearch(curr);
// }
// else
// {
// //cout<<filefind.name<<endl;
// if (NULL != strstr(filefind.name, ".avi"))
// {
// memcpy(filename[count], filefind.name, strlen(filefind.name));
// //Output("%d:%s\n", count, filename[count]);
// count++;
// }
// }
// }
// if (count > file_count)
// {
// for (i = 0; i < count - file_count ; i++)
// {
// //Output("%d:%s\n", i, filename[i]);
// curr=String(path) + "//" + filename[i];
// ret = remove(curr.c_str());
// memcpy(tmp, curr.c_str(), curr.length());
// memcpy(video_path, tmp + 56, 36);
// //strncat(video_path, ".mp4", 4);
// //Output("11111111111111the video_path is %s", video_path);
// //del((const char *)video_path);
// }
// }
//
// _findclose(handle);
//}
int changePath(char *uid, char *path)
{
char comNum[2] = {0};
char banNum[4] = {0};
char houNum[4] = {0};
memcpy(comNum, uid, 2);
memcpy(banNum, uid + 2, 4);
memcpy(houNum, uid + 6, 4);
strcat(path, "./apache-tomcat-7.0.37//webapps//FamilyGuardian//video//");
strncat(path, comNum, 2);
strcat(path, "//");
strncat(path, banNum, 4);
strcat(path, "//");
strncat(path, houNum, 4);
return 0;
}
int createMediaPath(char *uid, char *path)
{
char tmpPath[128] = {0};
changePath(uid, path);
memcpy(tmpPath, path, sizeof(tmpPath));
CheckDirectory(tmpPath);
return 0;
}
int mediaServiceStart(MEDIAINFO *mediaInfo, char *filePath)
{
int mediaRecvPort = 0;
MEDIAPATH mediaPath = {0};
char nowTime[32] = {0};
char path[128] = {0};
getNowTime(nowTime);
//strncat(filePath, nowTime, strlen(nowTime));
//memcpy(mediaPath.filePath, filePath, strlen(filePath) + 1);
if (!strncmp(mediaInfo->audio, "audio", 5))
{
mediaRecvPort = getMediaPort();
memset(mediaInfo->audio, 0, sizeof(mediaInfo->audio));
itoa(mediaRecvPort, mediaInfo->audio, 10);
memcpy(mediaPath.mediaValue, mediaInfo->audio, sizeof(mediaInfo->audio));
memset(path, 0, sizeof(path));
changeStr(filePath, "00", nowTime, ".wav", path);
memcpy(mediaPath.filePath, path, strlen(path) + 1);
mediaRecvPthreadInit(&mediaPath);
printf("mediaRecvPort is %d, mediaInfo->audio is %s.\n", mediaRecvPort, mediaInfo->audio);
}
if (!strncmp(mediaInfo->video0, "video0", 6))
{
mediaRecvPort = getMediaPort();
memset(mediaInfo->video0, 0, sizeof(mediaInfo->video0));
itoa(mediaRecvPort, mediaInfo->video0, 10);
memcpy(mediaPath.mediaValue, mediaInfo->video0, sizeof(mediaInfo->video0));
memset(path, 0, sizeof(path));
changeStr(filePath, "00", nowTime, ".dat", path);
memcpy(mediaPath.filePath, path, strlen(path) + 1);
mediaRecvPthreadInit(&mediaPath);
printf("mediaRecvPort is %d, mediaInfo->video0 is %s.\n", mediaRecvPort, mediaInfo->video0);
}
if (!strncmp(mediaInfo->video1, "video1", 6))
{
mediaRecvPort = getMediaPort();
memset(mediaInfo->video1, 0, sizeof(mediaInfo->video1));
itoa(mediaRecvPort, mediaInfo->video1, 10);
memcpy(mediaPath.mediaValue, mediaInfo->video1, sizeof(mediaInfo->video1));
memset(path, 0, sizeof(path));
changeStr(filePath, "01", nowTime, ".dat", path);
memcpy(mediaPath.filePath, path, strlen(path) + 1);
mediaRecvPthreadInit(&mediaPath);
printf("mediaRecvPort is %d, mediaInfo->video1 is %s.\n", mediaRecvPort, mediaInfo->video1);
}
if (!strncmp(mediaInfo->video2, "video2", 6))
{
mediaRecvPort = getMediaPort();
memset(mediaInfo->video2, 0, sizeof(mediaInfo->video1));
itoa(mediaRecvPort, mediaInfo->video2, 10);
memcpy(mediaPath.mediaValue, mediaInfo->video2, sizeof(mediaInfo->video2));
memset(path, 0, sizeof(path));
changeStr(filePath, "02", nowTime, ".dat", path);
memcpy(mediaPath.filePath, path, strlen(path) + 1);
mediaRecvPthreadInit(&mediaPath);
printf("mediaRecvPort is %d, mediaInfo->video2 is %s.\n", mediaRecvPort, mediaInfo->video2);
}
if (!strncmp(mediaInfo->video3, "video3", 6))
{
mediaRecvPort = getMediaPort();
memset(mediaInfo->video3, 0, sizeof(mediaInfo->video3));
itoa(mediaRecvPort, mediaInfo->video3, 10);
memcpy(mediaPath.mediaValue, mediaInfo->video3, sizeof(mediaInfo->video3));
memset(path, 0, sizeof(path));
changeStr(filePath, "03", nowTime, ".dat", path);
memcpy(mediaPath.filePath, path, strlen(path) + 1);
mediaRecvPthreadInit(&mediaPath);
printf("mediaRecvPort is %d, mediaInfo->video3 is %s.\n", mediaRecvPort, mediaInfo->video3);
}
printf("uid is %s.\n", mediaInfo->uid);
printf("audio is %s.\n", mediaInfo->audio);
printf("video0 is %s.\n", mediaInfo->video0);
printf("video1 is %s.\n", mediaInfo->video1);
printf("video2 is %s.\n", mediaInfo->video2);
printf("video3 is %s.\n", mediaInfo->video3);
return 0;
}
DWORD WINAPI mediaServicePthread(LPVOID pM)
{
BOOL bDontLinger = FALSE;
BOOL bReuseaddr = TRUE;
//int nNetTimeout = TIME; //阻塞
int recvAddrLen = 0;
char localip[20];
int recvLength = -1;
int sendLength = -1;
int recvAddrSize = sizeof(recvFromAddr);
char recvBuffer[BUFFER_SIZE] = {0};
char filePath[128] = {0};
MEDIAINFO mediaInfo = {0};
//USERINFO *userInfoHead = NULL;
//unsigned long ul = 1;
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
recvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//if (SOCKET_ERROR == ioctlsocket(recvSocket, FIONBIO, (unsigned long *)&ul)) //设置成非阻塞函数
//{
// printf("ioctlsocket fiald\n");
// return -1;
//}
memset(&recvAddr, 0, sizeof(recvAddr));
recvAddr.sin_family = AF_INET;
//recvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
recvAddr.sin_addr.S_un.S_addr = inet_addr(SERVERIP);
recvAddr.sin_port = htons(SERVERPORT);
recvAddrLen = sizeof(recvAddr);
if (0 != bind(recvSocket, (SOCKADDR *)&recvAddr, recvAddrLen))
{
printf("mediaRecvInit Bind filed!\n");
return -1;
}
setsockopt(recvSocket, SOL_SOCKET, SO_DONTLINGER, (const char*)&bDontLinger, sizeof(BOOL));
setsockopt(recvSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(BOOL));
//setsockopt(recvSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&nNetTimeout, sizeof(BOOL));
mediaServiceStatus = 1;
while (mediaServiceStatus)
{
memset(recvBuffer, 0, sizeof(recvBuffer));
recvLength = recvfrom(recvSocket, recvBuffer, sizeof(recvBuffer), 0, (SOCKADDR *)&recvFromAddr, &recvAddrSize);
recvBuffer[recvLength] = ‘\0‘;
if (strncmp("Media", recvBuffer, 5))
{
continue;
}
memcpy((unsigned char *)&mediaInfo, recvBuffer, recvLength);
mediaInfo.address = recvFromAddr;
//printf("uid is %s.\n", mediaInfo.uid);
//printf("audio is %s.\n", mediaInfo.audio);
//printf("video0 is %s.\n", mediaInfo.video0);
//printf("video1 is %s.\n", mediaInfo.video1);
//printf("video2 is %s.\n", mediaInfo.video2);
//printf("video3 is %s.\n", mediaInfo.video3);
if (0 != createMediaPath(mediaInfo.uid, filePath))
{
printf("create media path error\n");
}
if (0 != mediaServiceStart(&mediaInfo, filePath))
{
printf("media service start error\n");
}
memcpy(recvBuffer, (unsigned char *)&mediaInfo, sizeof(mediaInfo));
sendLength = sendto(recvSocket, recvBuffer, sizeof(mediaInfo), 0, (SOCKADDR *)&recvFromAddr, recvAddrSize);
if (0 > sendLength)
{
printf("send mediaInfo error\n");
}
}
closesocket(recvSocket);
WSACleanup();
return 0;
}
int mediaServicePthreadInit()
{
HANDLE mediaServiceHandle = NULL;
mediaServiceHandle = CreateThread(NULL, NULL, mediaServicePthread, NULL, 0 , NULL);
if (NULL == mediaServiceHandle)
{
printf("CreatePthread mediaServicePthread error.\n");
return -1;
}
else
{
printf("CreatePthread mediaServicePthread successfully.\n");
}
return 0;
}
int tempFun()
{
int ret = -1;
//ret = mediaRecvPthreadInit();
ret = mediaServicePthreadInit();
if (-1 == ret)
{
printf("mediaRecvPthreadInit faild\n");
return -1;
}
else
{
printf("mediaRecvPthreadInit successfully\n");
}
return 0;
}
int main(int argc, char *argv[])
{
char cmd[10] = {0};
tempFun();
//Sleep(10000);
while(1)
{
printf("input ‘quit‘ closed.\n");
scanf("%s", cmd);
if (!strncmp(cmd, "quit", 4))
{
break;
}
}
system("pause");
return 0;
}
udpMediaService.h