UDP Socket编程

UDP编程的服务器端一般步骤是:

1、创建一个socket,用函数socket();

3、绑定IP地址、端口等信息到socket上,用函数bind();

4、循环接收发送数据,用函数recvfrom()、sendto();

5、关闭网络连接;

 

UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();

2、设置对方的IP地址和端口等属性;

3、连接服务器,用函数connect();

  若是只是一次发送、接收数据,此函数可不用;

  若是循环发送接收,则此处要用connect函数;因为若不用,当sendto()后这时服务器器kill掉,则   client端阻塞在recvfrom处;

4、循环发送接收数据,用函数sendto()、recvfrom();

5、关闭网络连接;


使用C语言,实现过程如下:

UDPServer.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
 
#define BUFSIZE 1024
#define ip_address "127.0.0.1"
#define PORT 3000
 
int main()
{
     int sockfd;
     int port = PORT;
     struct sockaddr_in servaddr,clientaddr;
     struct hostent *hostp;
     char buf[BUFSIZE];
     int res;
 
     //create socket
     sockfd =socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
     //or sockfd = socket(AF_INET,SOCK_DGRAM,0);
     if(sockfd < 0)
     printf("errorcreate socket!\n");
     //set socket option
     int optval = 1;
     setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(constvoid*)&optval,sizeof(int));
 
     //build the server's Internet address
     bzero((char *)&servaddr,sizeof(servaddr));
     servaddr.sin_family = AF_INET;
     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
     servaddr.sin_port = htons(port);
 
     //bind
     if(bind(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr)) < 0)
     printf("error on binding!\n");
 
     //recvfrom and sendto in circle
     int clientlen = sizeof(clientaddr);
     while(1)
    {
       bzero(buf,BUFSIZE); 
       res = recvfrom(sockfd,buf,BUFSIZE,0,(structsockaddr*)&clientaddr,&clientlen);
       if(res < 0)
      {
         printf("error in recvfrom!\n");
         break;
      }
      res = sendto(sockfd,buf,strlen(buf),0,(structsockaddr*)&clientaddr,clientlen);
      if(res < 0)
      {  
          printf("error in sendto.\n");
          break;
      }
   }
   close(sockfd);
}


UDPClient.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>


#define BUFSIZE 1024


void error(char* msg)
{
perror(msg);
exit(0);
}


int main()
{
   int sockfd;
   int port = 3000;
   int res;
   struct sockaddr_in servaddr;
   char buf[BUFSIZE];
   //create socket
   sockfd = socket(AF_INET,SOCK_DGRAM,0);
   if(sockfd < 0)
   error("error create socket");


    //build the server's Internet address
    bzero((char *)&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    //servaddr.sin_addr = inet_addr("127.0.0.1"); 
    //or inet_aton("127.0.0.1",servaddr.sin_addr.s_addr);
    servaddr.sin_port = htons(port);


    //get msg from user
    bzero(buf,BUFSIZE);
    printf("Please enter msg:");
    fgets(buf,BUFSIZE,stdin);


    //send msg to server
    res = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
    if(res < 0)
         error("error in sendto");


    //print the server's reply
    int servaddrlen = sizeof(servaddr);
    res = recvfrom(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,&servaddrlen);
    if(res < 0)
        error("error in recvfrom");
    printf("Echo from server: %s",buf);

return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值