再讲点简单的udp
服务器端程序
// udpserver.c
#include <stdio.h>                    
#include <strings.h>                    /* for bzero() */
#include <unistd.h>                     /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>

#define PORT 1234     //将会被打开的端口
#define MAXDATASIZE 100     //最大的数据长度

int main()
{
  int sockfd;    
  struct sockaddr_in server;
  struct sockaddr_in client;
  int sin_size;
  int num;
  char msg[MAXDATASIZE];    

//socket
   if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)    
  {
    perror( "Creating socket failed.");
     exit(1);
  }
  
  int opt = SO_REUSEADDR;
  setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//bind  
  bzero(&server,sizeof(server));
  server.sin_family=AF_INET;
  server.sin_port=htons(PORT);
  server.sin_addr.s_addr = htonl (INADDR_ANY);
   if (bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
  {
    perror( "Bind error.");
     exit(1);
  }        

  sin_size=sizeof(struct sockaddr_in);
   while (1)    
  {
//recvfrom
    num = recvfrom(sockfd,msg,MAXDATASIZE,0,(struct sockaddr *)&client,&sin_size);                                                                        
     if (num < 0)
    {
      perror( "recvfrom error\n");
       exit(1);
    }

    msg[num] = '\0';
    printf( "server:You got a message (%s) from %s\n",msg,inet_ntoa(client.sin_addr) );
//sendto
    sendto(sockfd, "Welcome to my server.........\n",30,0,(struct sockaddr *)&client,sin_size);
     if (!strcmp(msg, "quit")) break;
  }
//close
  close(sockfd);    
}
客户端程序
// File: prg5_2.c
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h>                // for struct hostent    

#define PORT 1234     //远程服务器上的那个端口
#define MAXDATASIZE 100     /* Max number of bytes of data */

int main(int argc, char *argv[])
{
  int sockfd, numbytes;    
  char buf[MAXDATASIZE];    

  struct hostent *he;                
  struct sockaddr_in server,reply;

   if (argc !=3)
  {    
    printf( "Usage: %s <IP Address> <message>\n",argv[0]);
     exit(1);
  }

   if ((he=gethostbyname(argv[1]))== NULL)
  {    
    printf( "gethostbyname() error\n");
     exit(1);
  }
//socket
   if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0))==-1)
  {    
    printf( "socket() error\n");
     exit(1);
  }
//sendto
  bzero(&server,sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT); /* htons() is needed again */
  server.sin_addr = *((struct in_addr *)he->h_addr);    
  sendto(sockfd, argv[2], strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(struct sockaddr));

   while (1)
  {
    int len;
//recvfrom
     if ((numbytes=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&reply,& len)) == -1)
    {    
      printf( "recvfrom error\n");
       exit(1);
    }
    printf( "len=%d\n", len);
    printf( "sizefo(struct sockaddr)=%d\n",sizeof(struct sockaddr));
    printf( "server.sin_addr=%s\n",inet_ntoa(server.sin_addr));
    printf( "reply.sin_addr=%s\n",inet_ntoa(reply.sin_addr));
/*
     if ( len != sizeof(struct sockaddr) || memcmp(( const void *)&server, ( const void *)&reply, len) != 0)
    {
      printf( "Receive message from other server.\n");
      continue;
    }
*/
    buf[numbytes]= '\0';
    printf( "Server Message: %s\n",buf);
    break;
  }
//close
  close(sockfd);     /* close fd */
}
上面这两个程序都是来自张炯的作品《unix网络编程实用技术与实例分析》,我不要要推崇这个人的作品,我是要鄙视这本书,给得源码不是这有问题,就是那有问题,根本就不是一个负责任的态度
我看APUE就没有这么多的问题!
执行:
udpserver &
udpclient 127.0.0.1 yy
打印为:
server:You got a message (yy) from 127.0.0.1
len=16
sizefo(struct sockaddr)=16
server.sin_addr=127.0.0.1
reply.sin_addr=0.0.0.0
Server Message: Welcome to my server.........
大家也看到了,我在client中注释掉了一个if,作者的意思的是因为udp的recvfrom中指不定是接受谁的信息(确实),所以在这里鉴定一下服务器,返回的应该和server端的一样,我就下午看了一会儿,反正我是没明白,我的返回0.0.0.0,如果是其他的IP的那我明白,自然就不是这个主机,可是如果是这个主机的返回的也是0.0.0.0,也不是127.0.0.1呀,作者没说明白,看来是我太傻了
睡觉