static int socketDoOutput(socket_t *sp, char *buf, int toWrite, int *errCode) { struct sockaddr_in server; int bytes; a_assert(sp); a_assert(buf); a_assert(toWrite > 0); a_assert(errCode); *errCode = 0; #if (defined (WIN) || defined (CE)) if ((sp->flags & SOCKET_ASYNC) && ! socketWaitForEvent(sp, FD_CONNECT, errCode)) { return -1; } #endif /* * Write the data */ if (sp->flags & SOCKET_BROADCAST) { server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_BROADCAST; server.sin_port = htons((short)(sp->port & 0xFFFF)); if ((bytes = sendto(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server, sizeof(server))) < 0) { bytes = tryAlternateSendTo(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server); } } else if (sp->flags & SOCKET_DATAGRAM) { server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(sp->host); server.sin_port = htons((short)(sp->port & 0xFFFF)); bytes = sendto(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server, sizeof(server)); } else { bytes = send(sp->sock, buf, toWrite, 0); } if (bytes < 0) { *errCode = socketGetError(); #if (defined (WIN) || defined (CE)) sp->currentEvents &= ~FD_WRITE; #endif return -1; } else if (bytes == 0 && bytes != toWrite) { *errCode = EWOULDBLOCK; #if (defined (WIN) || defined (CE)) sp->currentEvents &= ~FD_WRITE; #endif return -1; } return bytes; }
static int socketDoOutput(socket_t *sp, char *buf, int toWrite, int *errCode) { struct sockaddr_in server; int bytes; a_assert(sp); a_assert(buf); a_assert(toWrite > 0); a_assert(errCode); *errCode = 0; #if (defined (WIN) || defined (CE)) if ((sp->flags & SOCKET_ASYNC) && ! socketWaitForEvent(sp, FD_CONNECT, errCode)) { return -1; } #endif /* * Write the data */ if (sp->flags & SOCKET_BROADCAST) { server.sin_family = AF_INET; #if (defined (UEMF) || defined (LITTLEFOOT)) server.sin_addr.s_addr = INADDR_BROADCAST; #else server.sin_addr.s_addr = inet_addr(basicGetBroadcastAddress()); #endif server.sin_port = htons((short)(sp->port & 0xFFFF)); if ((bytes = sendto(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server, sizeof(server))) < 0) { bytes = tryAlternateSendTo(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server); } } else if (sp->flags & SOCKET_DATAGRAM) { server.sin_family = AF_INET; server.sin_addr.s_addr = inet_addr(sp->host); server.sin_port = htons((short)(sp->port & 0xFFFF)); bytes = sendto(sp->sock, buf, toWrite, 0, (struct sockaddr *) &server, sizeof(server)); } else { bytes = send(sp->sock, buf, toWrite, 0); } if (bytes < 0) { *errCode = socketGetError(); #if (defined (WIN) || defined (CE)) sp->currentEvents &= ~FD_WRITE; #endif return -1; } else if (bytes == 0 && bytes != toWrite) { *errCode = EWOULDBLOCK; #if (defined (WIN) || defined (CE)) sp->currentEvents &= ~FD_WRITE; #endif return -1; } /* * Ensure we get to write some more data real soon if the socket can absorb * more data */ #ifndef UEMF #ifdef WIN if (sp->interestEvents & FD_WRITE) { emfTime_t blockTime = { 0, 0 }; emfSetMaxBlockTime(&blockTime); } #endif /* WIN */ #endif return bytes; }