Linux C实现简单的UDP服务器客户端通信

    最近在学习网络编程,以下代码摘抄自《精通linux c编程》,本地已经验证能跑通。

    数据报套接字使用的是UDP协议,UDP协议是无连接不可靠的数据报协议。在这种通信方式中,客户不与服务器建立连接,它单单通过sendto向服务器程序发送数据报,sendto函数本身要求一个地址参数给出服务程序的地址。同样的,服务程序也不会接收来自客户的连接,它只是调用recvfrom函数,这个函数等待来自某个客户的数据,并且把接收到的数据和客户端地址一起返回调用者。

#include
int recvfrom(int socket,void *buffer,size_t size,int flags,struct sockaddr * from,size_t * addrlen);
int sendto(int socket,void * buffer,size_t size,int flags,struct sockaddr * to,size_t addrlen);
    这两个函数的前三个参数socket,buffer,size分别表示套接字描述符,指向读写缓冲区的指针以及读写的字节数。

下面附上UDP server代码:

#include
#include
#include
#include

#define MAXMSG 1024

int main()
{
  int sockfd,size,nbytes;
  struct sockaddr_in addr;
  char message[MAXMSG],server_msg[MAXMSG];
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
    printf("Socket created failed.\n");
    return -1;
  }
  bzero(&addr,sizeof(addr));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(6666);
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  if(bind(sockfd,(struct sockaddr*)&addr,sizeof(addr))<0)
  {
    printf("Bind failed.\n");
    return -1;  
  }  
  while(1)
  {
    size=sizeof(addr);
    nbytes=recvfrom(sockfd,message,MAXMSG,0,(struct sockaddr *)&addr,&size);
    if(nbytes<0)
    {
      printf("Receive from server failed.\n");  
    }
    sprintf(server_msg,"Server got message:%s \n",message);
    nbytes=sendto(sockfd,server_msg,nbytes,0,(struct sockaddr *)&addr,size);
    if(nbytes<0)
    {
      printf("send to failed.\n");
      return -1;
    }
  }
}

    与之通信的的UDP client代码:

#include
#include
#include
#include
#include
#define MAXMSG 512

int main()
{
  int sockfd,n;
  struct sockaddr_in servaddr;
  char  recvbuff[MAXMSG],sndbuff[MAXMSG];
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
    printf("Socket created failed.\n");
    return -1;
  }
  servaddr.sin_family=AF_INET;
  servaddr.sin_port=htons(6666);
  servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
  while(fgets(sndbuff,MAXMSG,stdin)!=NULL)
  {
    if(sendto(sockfd,sndbuff,sizeof(sndbuff),0,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
    {
      printf("Client send  failed.\n");  
      return -1;
    }
    if((n=recvfrom(sockfd,recvbuff,MAXMSG,0,NULL,NULL))<0)
    {
      printf("Client receive error.\n");
      return -1;
    }
    recvbuff[n]=0;
    
    printf("(Client receive message)%s \n");
  }
  close(sockfd);
  return 0;
}


你可能感兴趣的:(Linux,C)