日期:2014-05-17  浏览次数:20739 次

Windows下纯C的Socket例子
/*******   服务器程序   (server.c)   ************/       
  #include   <stdlib.h>   
  #include   <stdio.h>   
  #include   <errno.h>   
  #include   <string.h>   
  #include   <netdb.h>   
  #include   <sys/types.h>   
  #include   <netinet/in.h>   
  #include   <sys/socket.h>   
  int   
  main   (int   argc,   char   *argv[])     
  {   
      int   sockfd,   new_fd;   
      struct   sockaddr_in   server_addr;   
      struct   sockaddr_in   client_addr;   
      int   sin_size,   portnumber;   
      char   hello[]   =   "Hello!   Are   You   Fine?\n";   
      if   (argc   !=   2)   
          {   
              fprintf   (stderr,   "Usage:%s   portnumber\a\n",   argv[0]);   
              exit   (1);   
          }   
      if   ((portnumber   =   atoi   (argv[1]))   <   0)   
          {   
              fprintf   (stderr,   "Usage:%s   portnumber\a\n",   argv[0]);   
              exit   (1);   
          }   
    
  /*   服务器端开始建立socket描述符   */   
      if   ((sockfd   =   socket   (AF_INET,   SOCK_STREAM,   0))   ==   -1)   
          {   
              fprintf   (stderr,   "Socket   error:%s\n\a",   strerror   (errno));   
              exit   (1);   
          }   
    
  /*   服务器端填充   sockaddr结构   */   
      bzero   (&server_addr,   sizeof   (struct   sockaddr_in));   
      server_addr.sin_family   =   AF_INET;   
      server_addr.sin_addr.s_addr   =   htonl   (INADDR_ANY);   
      server_addr.sin_port   =   htons   (portnumber);   
    
  /*   捆绑sockfd描述符   */     
          if   (bind   
  (sockfd,   (struct   sockaddr   *)   (&server_addr),   
    sizeof   (struct   sockaddr))   ==     
  -1)   
          {   
              fprintf   (stderr,   "Bind   error:%s\n\a",   strerror   (errno));   
              exit   (1);   
          }   
    
  /*   监听sockfd描述符   */   
      if   (listen   (sockfd,   5)   ==   -1)   
          {   
              fprintf   (stderr,   "Listen   error:%s\n\a",   strerror   (errno));   
              exit   (1);   
          }   
      while   (1)   
          {   
    
  /*   服务器阻塞,直到客户程序建立连接   */     
  sin_size   =   sizeof   (struct   sockaddr_in);   
              if   ((new_fd   =   
        accept   (sockfd,   (struct   sockaddr   *)   (&client_addr),   
        &sin_size))   ==   -1)   
  {   
      fprintf   (stderr,   "Accept   error:%s\n\a",   strerror   (errno));   
      exit   (1);   
  }   
              fprintf   (stderr,   "Server   get   connection   from   %s\n",   
                inet_ntoa   (client_addr.sin_addr));   
              if   (write   (new_fd,   hello,   strlen   (hello))   ==   -1)   
  {   
      fprintf   (stderr,   "Write   Error:%s\n",   strerror   (errno));   
      exit   (1);   
  }   
    
  /*   这个通讯已经结束   */   
              close   (new_fd);   
    
  /*   循环下一个   */     
          }   
      close   (sockfd);   
      exit   (0);   
  }   
    
/*******   客户端程序   client.c   ************/       
#include   <stdlib.h>   
#include   <stdio.h>   
#include   <errno.h>   
#include   <string.h>   
#include   <netdb.h>   
#include   <sys/types.h>   
#include   <netinet/in.h>   
#include   <sys/socket.h>   
    int   
main   (int   argc,   char   *argv[])     
{   
      
int   sockfd;   
      
char   buffer[1024];   
      
struct   sockaddr_in   server_addr;   
      
struct   hostent   *host;   
      
int   portnumber,   nbytes;   
      
if   (argc   !=   3)   
          
        {   
              
fprintf   (stderr,   "Usage:%s   hostname   portnumber\a\n",   argv[0]);   
              
exit   (1);   
          
}   
      
if   ((host   =   gethostbyname   (argv[1]))   ==   NULL)   
          
        {   
              
fprintf   (stderr,   "Gethostname   error\n");   
              
exit   (1);   
          
}   
      
if   ((portnumber