// Make TCP server socket long TCPSOCK_MakeServer (SOCKET *sock, long TCP_Port, long QueueSize) { SOCKADDR_IN sin; long optvalue; *sock = socket (PF_INET, SOCK_STREAM, 0); if (*sock == INVALID_SOCKET) { return FALSE; } optvalue = -1; setsockopt (*sock, SOL_SOCKET, SO_REUSEADDR, (char *)(&optvalue), sizeof (optvalue)); sin.sin_family = PF_INET; sin.sin_port = htons ((unsigned short)(TCP_Port)); sin.sin_addr.s_addr = INADDR_ANY; if (bind (*sock, (struct sockaddr *)&sin, sizeof(sin)) != 0) { SOCK_Disconnect (sock); return FALSE; } if (listen (*sock, QueueSize) != 0) { SOCK_Disconnect (sock); return FALSE; } return TRUE; }
// Connect to TCP server socket long TCPSOCK_Connect (SOCKET *sock, char *IP_Address, long TCP_Port, long nonblocking) { SOCKADDR_IN sin; unsigned long haddr; u_long option; if ((haddr = GetIPbyDomain (IP_Address)) == (unsigned long)INADDR_NONE) return FALSE; if ((*sock = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) return FALSE; sin.sin_family = PF_INET; sin.sin_port = htons ((unsigned short)(TCP_Port)); sin.sin_addr.s_addr = haddr; if (nonblocking) { option = 1; ioctlsocket (*sock, FIONBIO, &option); } if (connect (*sock, (struct sockaddr *)&sin, sizeof sin) == SOCKET_ERROR) if (errno != EINPROGRESS) { SOCK_Disconnect (sock); return FALSE; } if (nonblocking) { option = 0; ioctlsocket (*sock, FIONBIO, &option); } return TRUE; }
uint16_t SOCK_Send(uint8_t sock, const uint8_t *buf, uint16_t buflen) { uint16_t offaddr, realaddr, txsize, timeout; uint8_t val; if (buflen<=0 || sock!=0) { return 0; } #if _DEBUG_MODE printf("Send Size: %d\n",buflen); #endif /* Make sure the TX Free Size Register is available */ W5100_MemReadWord(W5100_SO_TX_FSR, &txsize); #if _DEBUG_MODE printf("TX Free Size: %d\n",txsize); #endif timeout=0; while (txsize<buflen) { WAIT1_WaitOSms(1); W5100_MemReadWord(W5100_SO_TX_FSR, &txsize); /* Timeout for approximately 1000 ms */ if (timeout++ > 1000) { #if _DEBUG_MODE printf("TX Free Size Error!\n"); #endif /* Disconnect the connection */ SOCK_Disconnect(sock); return 0; } } /* Read the Tx Write Pointer */ W5100_MemReadWord(W5100_S0_TX_WR, &offaddr); #if _DEBUG_MODE printf("TX Buffer: %x\n", offaddr); #endif while(buflen) { buflen--; /* Calculate the real W5100 physical Tx Buffer Address */ realaddr = W5100_TXBUFADDR+(offaddr&W5100_TX_BUF_MASK); /* Copy the application data to the W5100 Tx Buffer */ W5100_MemWriteByte(realaddr, *buf); offaddr++; buf++; } /* Increase the S0_TX_WR value, so it point to the next transmit */ W5100_MemWriteWord(W5100_S0_TX_WR, offaddr); /* Now Send the SEND command */ W5100_MemWriteByte(W5100_S0_CR, W5100_CR_SEND); /* Wait for Sending Process */ do { W5100_MemReadByte(W5100_S0_CR, &val); } while(val!=0); return 1; }
uint8_t SOCK_Send(uint8_t sock, const uint8_t *buf, size_t buflen) { uint16_t offaddr, realaddr, txsize, timeout, sockaddr; uint8_t val; if (buflen<=0 || sock>=W5100_NUM_SOCKETS) { return ERR_VALUE; } sockaddr = W5100_SKT_BASE(sock); /* Make sure the TX Free Size Register is available */ W5100_MemReadWord(sockaddr+W5100_TX_FSR_OFFSET, &txsize); timeout=0; while (txsize<buflen) { WAIT1_WaitOSms(1); W5100_MemReadWord(sockaddr+W5100_TX_FSR_OFFSET, &txsize); /* Timeout for approximately 1000 ms */ if (timeout++ > 1000) { /* Disconnect the connection */ SOCK_Disconnect(sock); return ERR_FAILED; } } /* Read the Tx Write Pointer */ W5100_MemReadWord(sockaddr+W5100_TX_WR_OFFSET, &offaddr); while(buflen) { buflen--; /* Calculate the real W5100 physical Tx Buffer Address */ realaddr = (W5100_TXBUFADDR+(0x0800*sock)) + (offaddr&W5100_TX_BUF_MASK); /* Copy the application data to the W5100 Tx Buffer */ W5100_MemWriteByte(realaddr, *buf); offaddr++; buf++; } /* Increase the S0_TX_WR value, so it point to the next transmit */ W5100_MemWriteWord(sockaddr+W5100_TX_WR_OFFSET, offaddr); /* Now Send the SEND command */ W5100_MemWriteByte(sockaddr+W5100_CR_OFFSET, W5100_CR_SEND); /* Wait for Sending Process */ do { W5100_MemReadByte(sockaddr+W5100_CR_OFFSET, &val); } while(val!=0); return ERR_OK; }