コード例 #1
0
ファイル: socketclass.c プロジェクト: xsmart/3535
// 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;
}
コード例 #2
0
ファイル: socketclass.c プロジェクト: xsmart/3535
// 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;
}
コード例 #3
0
ファイル: socket.c プロジェクト: LucaGotti/mcuoneclipse
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;
}
コード例 #4
0
ファイル: socket.c プロジェクト: 210221030/mcuoneclipse
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;
}