linux网络程序代码(UDP)

linux网络程序代码(UDP)

服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MYPORT 4950
#define MAXBUFLEN 1024

int main(void)
{
  int sockfd;
  struct sockaddr_in my_addr;
  struct sockaddr_in their_addr;
  int addr_len,numbytes;
  char buf[MAXBUFLEN];

  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
    {
      perror("socket fail\n");
      exit(1);
    }

  my_addr.sin_family=AF_INET;
  my_addr.sin_port=htons(MYPORT);
  my_addr.sin_addr.s_addr=INADDR_ANY;
  memset(&(my_addr.sin_zero),'\0',8);
  if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
    {
      perror("bind fail\n");
      exit(1);
    }

  while(1)
    {
      addr_len=sizeof(struct sockaddr);
      if((numbytes=recvfrom(sockfd,buf,MAXBUFLEN,0,
       (struct sockaddr*)&their_addr,&addr_len))==-1)
{
   perror("recvfrom fail\n");
   exit(1);
}
      buf[numbytes]='\0';
      printf("%s says:%s",inet_ntoa(their_addr.sin_addr),buf);
    }

  close(sockfd);
  return 0;
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <signal.h>

#define MYPORT 4950
#define MAXBUFLEN 1024

void sigchld_handler(int s)
{
  while(wait(NULL)>0);
}

int main(int argc,char *argv[])
{
  int sockfd;
  struct sockaddr_in their_addr;
  struct hostent *he;
  int numbytes;
  char send_buf[MAXBUFLEN];
  struct sigaction sa;

  if(argc!=2)
    {
      fprintf(stderr,"usage:talker hostname\n");
      exit(1);
    }

if((he=gethostbyname(argv[1]))==NULL)
    {
      perror("gethostbyname fail\n");
      exit(1);
    }

  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
    {
      perror("socket fail\n");
      exit(1);
    }

  while(1)
    {
      char *ptr;
      their_addr.sin_family=AF_INET;
      their_addr.sin_port=htons(MYPORT);
      their_addr.sin_addr=*((struct in_addr *)he->h_addr);
      memset(&(their_addr.sin_zero),'\0',8);
      printf("send to server:");
      ptr=send_buf;

      sa.sa_handler=sigchld_handler;
      sigemptyset(&sa.sa_mask);
      sa.sa_flags=SA_RESTART;
      if(sigaction(SIGPIPE,&sa,NULL)==-1)
        {
          perror("sigaction fail\n");
          exit(1);
        }

      do
        {
   *ptr=getchar();
   ptr++;
}while(*(ptr-1)!='\n');
      *ptr='\0';

      if((numbytes=sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)))==-1)
{
   perror("sendto fail\n");
   exit(1);
}
    }
  close(sockfd);
  return 0;
}