⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockets.c

📁 FreeAMP(MP3播放)程序源代码-用来研究MP3解码
💻 C
字号:
#include <unistd.h>
#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>

#include "debug.h"
#include "sockets.h"


/**************************************************
  LCDproc client sockets code...

  Feel free to use this in your own clients... :)
**************************************************/


/* Length of longest transmission allowed at once... */
#define MAXMSG 8192


typedef struct sockaddr_in sockaddr_in;


static int sock_init_sockaddr (sockaddr_in *name,
		   const char *hostname,
		   unsigned short int port)
{
  struct hostent *hostinfo;
     
  name->sin_family = AF_INET;
  name->sin_port = htons(port);
  hostinfo = gethostbyname (hostname);
  if (hostinfo == NULL)
    {
      fprintf (stderr,"sock_init_sockaddr: Unknown host %s.\n", hostname);
      return -1;
    }
  name->sin_addr = *(struct in_addr *) hostinfo->h_addr;

  return 0;
  
}

 /* Client functions... */
int sock_connect(const char *host, unsigned short int port)
{
  struct sockaddr_in servername;
  int sock;
  int err=0;
  
  
  /* jdw debug("sock_connect: Creating socket\n"); */
  sock = socket(PF_INET, SOCK_STREAM, 0);
  if(sock < 0)
    {
      fprintf(stderr,"sock_connect: Error creating socket\n");
      return sock;
    }
  /* jdw debug("sock_connect: Created socket (%i)\n", sock); */
  
  sock_init_sockaddr(&servername, host, port);
  
  err = connect (sock,
		 (struct sockaddr *) &servername,
		 sizeof (servername));
  if(err<0)
    {
      fprintf (stderr,"sock_connect: connect failed\n");
      shutdown(sock, 2);
      return 0;  /* Normal exit if server doesn't exist... */
    }
  
  fcntl(sock, F_SETFL, O_NONBLOCK);

  
  return sock;
}

int sock_close(int fd)
{
   int err;
   
   err=shutdown(fd, 2);

   return err;
}

/* Send/receive lines of text */
int sock_send_string(int fd, const char *string)
{
   int err;

   if(!string) return -1;
   
   err = write (fd, string, strlen(string) + 1);
   if (err < 0)
   {
      fprintf (stderr,"sock_send_string: socket write error\n");
      /* shutdown(fd, 2); */
      return err;
   }

   /*printf("sock_send_string: %i bytes\n", err);*/
   
   return err;
}

/* Recv gives only one line per call... */
int sock_recv_string(int fd, char *dest, size_t maxlen)
{
   char * err;
   int i;

   /* TODO:  Get this function to work right somehow... */
   return -1;
   
   if(!dest) return -1;
   if(maxlen <= 0) return 0;

   /* Read in characters until the end of the line... */
   for(i=0;
       (size_t)i<maxlen && (read(fd, dest+i, 1) > 0);
       i++)
      if(dest[i] == 0  ||  dest[i] == '\n') break;
      
   if (err == NULL)
   {
      fprintf (stderr,"sock_recv_string: socket read error\n");
      /*shutdown(fd, 2);*/
      return -1;
   }
   printf("sock_recv_string: Got message \"%s\"\n", dest);
   
   return strlen(dest);
}

/* Send/receive raw data */
int sock_send(int fd, void *src, size_t size)
{
   int err;

   if(!src) return -1;
   
   err = write (fd, src, size);
   if (err < 0)
    {
      fprintf (stderr,"sock_send: socket write error\n");
      /*shutdown(fd, 2);*/
      return err;
    }

   return err;
}

int sock_recv(int fd, void *dest, size_t maxlen)
{
   int err;
   
   if(!dest) return -1;
   if(maxlen <= 0) return 0;
   
   err = read (fd, dest, maxlen);
   if (err < 0)
   {
      /*fprintf (stderr,"sock_recv: socket read error\n");
        shutdown(fd, 2);*/
      return err;
   }
   /*debug("sock_recv: Got message \"%s\"\n", (char *)dest);*/
   
   return err;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -