void ILibAsyncSocket_Resume(void *socketModule) { struct AsyncSocketModule *sm = (struct AsyncSocketModule*)socketModule; if(sm->PAUSE!=0) { sm->PAUSE=0; ILibForceUnBlockChain(sm->Chain); } }
void ILibAsyncSocket_ConnectTo(void* socketModule, int localInterface, int remoteInterface, int remotePortNumber, void (*InterruptPtr)(void *socketModule, void *user),void *user) { int flags; struct sockaddr_in addr; struct AsyncSocketModule *module = (struct AsyncSocketModule*)socketModule; module->PendingBytesToSend = 0; module->TotalBytesSent = 0; module->IsFree = 0; module->PAUSE = 0; module->user = user; module->OnInterrupt = InterruptPtr; module->buffer = (char*)realloc(module->buffer,module->InitialSize); module->MallocSize = module->InitialSize; memset((char *)&addr, 0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = remoteInterface; #ifdef _WIN32_WCE addr.sin_port = htons((unsigned short)remotePortNumber); #elif WIN32 addr.sin_port = htons(remotePortNumber); #elif _POSIX addr.sin_port = htons(remotePortNumber); #endif if(module->internalSocket==-1) { #ifdef WINSOCK2 ILibGetStreamSocket(localInterface,0,(HANDLE*)&(module->internalSocket)); #else ILibGetStreamSocket(localInterface,0,&(module->internalSocket)); #endif } module->FinConnect = 0; module->BeginPointer = 0; module->EndPointer = 0; #ifdef _WIN32_WCE flags = 1; ioctlsocket(module->internalSocket,FIONBIO,&flags); #elif WIN32 flags = 1; ioctlsocket(module->internalSocket,FIONBIO,&flags); #elif _POSIX flags = fcntl(module->internalSocket,F_GETFL,0); fcntl(module->internalSocket,F_SETFL,O_NONBLOCK|flags); #endif connect(module->internalSocket,(struct sockaddr*)&addr,sizeof(addr)); ILibForceUnBlockChain(module->Chain); }
int ILibAsyncSocket_Send(void* socketModule, char* buffer, int length, int UserFree) { struct AsyncSocketModule *module = (struct AsyncSocketModule*)socketModule; struct AsyncSocket_SendData *data = (struct AsyncSocket_SendData*)MALLOC(sizeof(struct AsyncSocket_SendData)); int unblock=0; int bytesSent; data->buffer = buffer; data->bufferSize = length; data->bytesSent = 0; data->UserFree = UserFree; data->Next = NULL; sem_wait(&(module->SendLock)); module->PendingBytesToSend += length; if(module->PendingSend_Tail!=NULL) { module->PendingSend_Tail->Next = data; module->PendingSend_Tail = data; unblock=1; } else { module->PendingSend_Tail = data; module->PendingSend_Head = data; bytesSent = send(module->internalSocket,module->PendingSend_Head->buffer+module->PendingSend_Head->bytesSent,module->PendingSend_Head->bufferSize-module->PendingSend_Head->bytesSent,0); if(bytesSent>0) { module->PendingSend_Head->bytesSent+=bytesSent; module->PendingBytesToSend -= bytesSent; } if(module->PendingSend_Head->bytesSent==module->PendingSend_Head->bufferSize) { module->PendingSend_Tail = NULL; FREE(module->PendingSend_Head); module->PendingSend_Head = NULL; } else { unblock = 1; } } sem_post(&(module->SendLock)); if(unblock!=0) {ILibForceUnBlockChain(module->Chain);} return(unblock); }
int ILibAsyncSocket_Send(void* socketModule, char* buffer, int length, enum ILibAsyncSocket_MemoryOwnership UserFree) { struct AsyncSocketModule *module = (struct AsyncSocketModule*)socketModule; struct AsyncSocket_SendData *data = (struct AsyncSocket_SendData*)MALLOC(sizeof(struct AsyncSocket_SendData)); int unblock=0; int bytesSent; data->buffer = buffer; data->bufferSize = length; data->bytesSent = 0; data->UserFree = UserFree; data->Next = NULL; sem_wait(&(module->SendLock)); if(module->internalSocket==~0) { // Too Bad, the socket closed if(UserFree==0){FREE(buffer);} free(data); sem_post(&(module->SendLock)); return(ILibAsyncSocket_SEND_ON_CLOSED_SOCKET_ERROR); } module->PendingBytesToSend += length; if(module->PendingSend_Tail!=NULL) { module->PendingSend_Tail->Next = data; module->PendingSend_Tail = data; unblock=1; if(UserFree==ILibAsyncSocket_MemoryOwnership_USER) { data->buffer = (char*)malloc(data->bufferSize); memcpy(data->buffer,buffer,length); data->UserFree = ILibAsyncSocket_MemoryOwnership_CHAIN; } } else { module->PendingSend_Tail = data; module->PendingSend_Head = data; bytesSent = send(module->internalSocket,module->PendingSend_Head->buffer+module->PendingSend_Head->bytesSent,module->PendingSend_Head->bufferSize-module->PendingSend_Head->bytesSent,0); if(bytesSent>0) { module->PendingSend_Head->bytesSent+=bytesSent; module->PendingBytesToSend -= bytesSent; module->TotalBytesSent += bytesSent; } if(bytesSent==-1) { // Send Failed #ifdef _WIN32_WCE bytesSent = WSAGetLastError(); if(bytesSent!=WSAEWOULDBLOCK) #elif WIN32 bytesSent = WSAGetLastError(); if(bytesSent!=WSAEWOULDBLOCK) #else if(errno!=EWOULDBLOCK) #endif { if(UserFree==0){FREE(buffer);} module->PendingSend_Head = module->PendingSend_Tail = NULL; free(data); sem_post(&(module->SendLock)); ILibAsyncSocket_Disconnect(socketModule); return(ILibAsyncSocket_SEND_ON_CLOSED_SOCKET_ERROR); } } if(module->PendingSend_Head->bytesSent==module->PendingSend_Head->bufferSize) { if(UserFree==0){FREE(module->PendingSend_Head->buffer);} module->PendingSend_Tail = NULL; FREE(module->PendingSend_Head); module->PendingSend_Head = NULL; } else { if(UserFree==ILibAsyncSocket_MemoryOwnership_USER) { data->buffer = (char*)malloc(data->bufferSize); memcpy(data->buffer,buffer,length); data->UserFree = ILibAsyncSocket_MemoryOwnership_CHAIN; } unblock = 1; } } sem_post(&(module->SendLock)); if(unblock!=0) {ILibForceUnBlockChain(module->Chain);} return(unblock); }
void ILibStopChain(void *Chain) { ((struct ILibBaseChain*)Chain)->TerminateFlag = 1; ILibForceUnBlockChain(Chain); }