📄 obmain.cxx
字号:
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (ecode=%d)! -- retrying(%d/%d)\n", WSAGetLastError(), i, SOCKET_CREATION_ATTEMPTS));
Sleep(1000);
}
}
if (sl == INVALID_SOCKET) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)!\n", WSAGetLastError()));
return FALSE;
}
if (af == AF_BT) {
SOCKADDR_BTH sa;
memset (&sa, 0, sizeof(sa));
sa.addressFamily = AF_BT;
sa.port = 0;
if (bind (sl, (sockaddr *)&sa, sizeof(sa))) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: bind failed (error=%d)!\n", WSAGetLastError()));
closesocket (sl);
return FALSE;
}
int namelen = sizeof(SOCKADDR_BTH);
if (getsockname(sl, (SOCKADDR *)&sa, &namelen)) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: getsockname failed (error=%d)!\n", WSAGetLastError()));
closesocket(sl);
return FALSE;
}
SVSUTIL_ASSERT(sa.port);
uiSDPRecordHandleCnt = MAX_NUM_STP_RECS;
if (ERROR_SUCCESS != obutil_RegisterPort((unsigned char)sa.port, &SDPRecordHandle[0], &uiSDPRecordHandleCnt) ) {
IFDBG(svslog_DebugOut(VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: failed to register port with SDP\n"));
closesocket(sl);
return FALSE;
}
} else {
SVSUTIL_ASSERT (0);
closesocket (sl);
return FALSE;
}
if (listen (sl, 5)) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start::Listen failed (error=%d)!\n", WSAGetLastError()));
closesocket (sl);
return FALSE;
}
++cSockets;
if (! hThread)
hThread = CreateThread (NULL, 0, ThreadListen, (void *)this, 0, NULL);
if (! hThread) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start failed to create thread (error=0x%08x (%d))\n", GetLastError(), GetLastError ()));
closesocket (sl);
return FALSE;
}
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Start - successfully started af %d\n", af));
return TRUE;
}
int AddressFamily::Start (int af, char *szServiceName) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_MAINTAIN, L"[OBEX] GlobalData::Start :: IRDA\n"));
SVSUTIL_ASSERT (gpState->IsLocked ());
SVSUTIL_ASSERT (cSockets < OBEX_MAXPORTS);
addFam[cSockets] = af;
SOCKET sl;
for(int i=0; i < SOCKET_CREATION_ATTEMPTS; i++) {
sl = aSocket[cSockets] = socket (af, SOCK_STREAM, 0);
if(sl != INVALID_SOCKET)
break;
else {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)! -- retrying(%d/%d)\n", WSAGetLastError(), i, SOCKET_CREATION_ATTEMPTS));
Sleep(1000);
}
}
if (sl == INVALID_SOCKET) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start: no sockets (error=%d)!\n", WSAGetLastError()));
return FALSE;
}
if (af == AF_IRDA) {
SOCKADDR_IRDA sa;
memset(&sa, 0, sizeof(SOCKADDR_IRDA));
sa.irdaAddressFamily = AF_IRDA;
if(strlen(szServiceName) + 1 > sizeof(sa.irdaServiceName))
{
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AF_IRDA: name too long! (%s)\n", szServiceName));
closesocket (sl);
return FALSE;
}
strcpy (sa.irdaServiceName, szServiceName);
if (bind (sl, (const struct sockaddr *)&sa, sizeof(sa))) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AF_IRDA: bind failed (error=%d)!\n", WSAGetLastError()));
closesocket (sl);
return FALSE;
}
} else {
SVSUTIL_ASSERT (0);
closesocket (sl);
return FALSE;
}
if (listen (sl, 5)) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start::Listen failed (error=%d)!\n", WSAGetLastError()));
closesocket (sl);
return FALSE;
}
++cSockets;
if (! hThread)
hThread = CreateThread (NULL, 0, ThreadListen, (void *)this, 0, NULL);
if (! hThread) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Start failed to create thread (error=0x%08x (%d))\n", GetLastError(), GetLastError ()));
closesocket (sl);
--cSockets;
return FALSE;
}
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Start - successfully started af %d\n", af));
return TRUE;
}
int AddressFamily::Stop (void) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Stop\n"));
SVSUTIL_ASSERT (gpState->IsLocked ());
for (int i = 0 ; i < cSockets ; ++i)
closesocket (aSocket[i]);
cSockets = 0;
return TRUE;
}
int AddressFamily::IsDown (void) {
if (! hThread)
return TRUE;
if (WAIT_TIMEOUT == WaitForSingleObject (hThread, 1000))
return FALSE;
return TRUE;
}
void AddressFamily::Listen (void) {
//
// If gpState isnt here, we have to quit!
//
if(!gpState) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Listen -- no GLOBAL STATE!\n"));
return;
}
SOCKET sockarray[FD_SETSIZE];
int l_cSockets = 0;
int l_cAccepts = 0;
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_INIT, L"[OBEX] AddressFamily::Listen\n"));
for ( ; ; )
{
gpState->Lock ();
if (gpState->fState != RUNNING) {
gpState->Unlock ();
break;
}
//
// This is here so this is not accessed without a lock...
//
l_cSockets = l_cAccepts = cSockets;
Connection *pConn = gpState->pconnList;
while (pConn) {
if (pConn->paf == this)
++l_cSockets;
pConn = pConn->pNext;
}
int iSocket = 0;
if (cSockets > FD_SETSIZE) { // Do not accept any more...
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_WARNINGS, L"[OBEX] Listen: too many sockets - some connections will not be served: %d sockets\n", l_cSockets));
l_cAccepts = 0;
} else { // Copy
iSocket = cSockets;
memcpy (sockarray, aSocket, sizeof(SOCKET) * cSockets);
}
pConn = gpState->pconnList;
while (pConn) {
if (pConn->paf == this)
sockarray[iSocket++] = pConn->s;
if (iSocket >= FD_SETSIZE)
break;
pConn = pConn->pNext;
}
gpState->Unlock ();
SVSUTIL_ASSERT (! gpState->IsLocked ());
FD_SET fd;
FD_ZERO (&fd);
for (int i = 0 ; i < l_cSockets ; ++i)
FD_SET(sockarray[i], &fd);
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen thread reenters select %d accept %d read\n", l_cAccepts, l_cSockets - l_cAccepts));
if (SOCKET_ERROR == select (0, &fd, NULL, NULL, NULL)) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Listen: select failed - %d\n", WSAGetLastError ()));
continue;
}
if (gpState->fState != RUNNING)
break;
int fExit = FALSE;
for (i = 0 ; (i < l_cSockets) && (! fExit) ; ++i) {
if (obutil_PollSocket (sockarray[i]) == 1) {
if (i < l_cAccepts) { // This is an accept call
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen : incoming connection on %s at index %d\n", (addFam[i] == PF_INET || addFam[i] == PF_INET6) ? L"TCP/IP" : ((addFam[i] == AF_IRDA) ? L"IRDA" : L"Bluetooth"),i));
union {
SOCKADDR_STORAGE sa_in;
SOCKADDR_IRDA sa_irda;
SOCKADDR_BTH sa_bth;
SOCKADDR sa;
} sa;
int addrlen = 0;
if (addFam[i] == PF_INET || addFam[i] == PF_INET6)
addrlen = sizeof (SOCKADDR_STORAGE);
else if (addFam[i] == AF_IRDA)
addrlen = sizeof(SOCKADDR_IRDA);
else if (addFam[i] == AF_BT)
addrlen = sizeof(SOCKADDR_BTH);
SVSUTIL_ASSERT (addrlen);
SOCKET s = accept (sockarray[i], &sa.sa, &addrlen);
if (s != INVALID_SOCKET) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Accepted connection\n"));
gpState->Lock ();
if (gpState->fState != RUNNING) {
closesocket (s);
gpState->Unlock ();
fExit = TRUE;
break;
}
//
// This is a new connection.
//
pConn = (Connection *)svsutil_GetFixed (gpState->pfmdConnections);
if (pConn) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen: added new connection for socket %d\n", s));
pConn->s = s;
pConn->addFam = addFam[i];
pConn->paf = this;
pConn->uiCurrentTransaction = 0;
pConn->uiConnectionId = OBEX_INVALID_CID;
pConn->pNext = gpState->pconnList;
pConn->tickLastActive = GetTickCount ();
pConn->pBuffer = NULL;
pConn->cBufSize = pConn->cFilled = 0;
pConn->cPeekFilled = 0;
gpState->pconnList = pConn;
gpState->SetMaintain();
} else {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] Listen: failed to allocate structure for incoming connection (OOM)\n"));
closesocket (s);
}
gpState->Unlock ();
} else
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen incoming connection failed to materialize\n"));
continue;
}
//
// Got a packet... do a RECV...
//
gpState->Lock ();
if (gpState->fState != RUNNING) {
gpState->Unlock ();
break;
}
pConn = gpState->pconnList;
while (pConn) {
if ((pConn->paf == this) && (pConn->s == sockarray[i]))
break;
pConn = pConn->pNext;
}
if (! pConn) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"[OBEX] AddressFamily::Listen packet on %s : nonexistent connection\n", (pConn->addFam == PF_INET || pConn->addFam == PF_INET6) ? L"TCP/IP" : ((pConn->addFam == AF_IRDA) ? L"IRDA" : L"Bluetooth")));
gpState->Unlock ();
continue;
}
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] AddressFamily::Listen got some data on %s at index %d\n", (pConn->addFam == PF_INET || pConn->addFam == PF_INET6) ? L"TCP/IP" : ((pConn->addFam == AF_IRDA) ? L"IRDA" : L"Bluetooth"),i));
int ires;
if (pConn->uiCurrentTransaction) {
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_ERRORS, L"Listen: received data for connection currently in transaction 0x%08x\n", pConn->uiCurrentTransaction));
gpState->CloseConnection (pConn);
gpState->Unlock ();
continue;
}
pConn->tickLastActive = GetTickCount ();
if (! pConn->pBuffer) {
ires = recv (pConn->s, (char *)pConn->ucPeekBuff + pConn->cPeekFilled, sizeof(pConn->ucPeekBuff) - pConn->cPeekFilled, 0);
if (ires <= 0) {
#if defined (DEBUG) || defined (_DEBUG)
if (ires == 0)
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Listen: connection %d closed at the request of the client\n", pConn->s));
else if (ires < 0)
IFDBG(svslog_DebugOut (VERBOSE_OUTPUT_PROTOCOL, L"[OBEX] Listen: connection %d closed because of socket error %d (RECV returns %d)\n", pConn->s, WSAGetLastError (), ires));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -