Linux下UDP一发一收通信

  实现在Linux环境下的UDP通信测试。

       注释了while循环,将代码规范化。

       udpserver.c代码:

/**********************************************************************
* 版权所有 (C)2016, WangSq。
*
* 文件名称:xx.c
* 文件标识:无
* 内容摘要:udpserver演示程序
* 其它说明:无
* 当前版本:V1.0
* 作    者:WangSq
* 完成日期:2016
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
/********************socket相关******************************************/
//socket参数
#define SERVER_PORT 2234                 /*监听端口*/
#define MAX_MSG_SIZE 256              /*recv缓冲器大小*/
int sockfd;  //套接字描述符

/*客户机的地址信息及长度信息*/
struct sockaddr_in client;
int  client_len=sizeof(struct sockaddr_in); 

//udp服务器监听函数初始化
void udpser_init()
{
   /*服务器的地址信息*/
   struct sockaddr_in server;

  /*服务器填充sockaddr server结构*/
    bzero(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_addr.s_addr=htonl(INADDR_ANY);
    server.sin_port=htons(SERVER_PORT);
   
   /*服务器建立socket描述符*/
    if(-1 == (sockfd=socket(AF_INET, SOCK_DGRAM,0)))    
        {
            perror("create socket failed");
            exit (1);
        }
    /*捆绑socket描述符sockfd*/
    if(-1 == ( bind( sockfd, ( struct sockaddr * )&server, sizeof(server) )) )
        {
            perror("bind error");
            exit (1);    
        }
}

/*接收缓冲区--------------------len =4-----------------*/
unsigned char message[MAX_MSG_SIZE];
int recv_len=0;
/* IP地址的存放缓冲区*/
char addr_p[INET_ADDRSTRLEN];
char *sndbuf = "Hello! i am OK.
";
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号     修改人            修改内容
* -------------------------------------------------------------------
* 2016xxxx       V1.0       WangSq       创建
***********************************************************************/
int main(int argc, char *argv[])
{
    
    
    //udp服务器监听函数初始化
    udpser_init();
//    while(1)
//    {
        /********************************接收数据并打印*************************/
        recv_len=recvfrom(sockfd,message,sizeof(message),0,(struct sockaddr *)&client,&client_len); //阻塞式
        if(recv_len <0)
        {
           printf("recvfrom error
");
           exit(1);
        }
        /*打印客户端地址和端口号*/
        inet_ntop(AF_INET,&client.sin_addr,addr_p,sizeof(addr_p));
        printf("client IP is %s, port is %d
",addr_p,ntohs(client.sin_port));
        message[recv_len]='';
        /*显示消息长度*/
        printf("server received %d:%s
", recv_len, message);

        /********************************回发数据*************************/ 
        if(sendto(sockfd,sndbuf,strlen(sndbuf),0,(struct sockaddr*)&client,client_len)<0)
        {
           printf("sendto error
");
           exit(1);
        }
//    }
    return 0;
}
View Code

    udpclient.c代码:

/**********************************************************************
* 版权所有 (C)2016, WangSq。
*
* 文件名称:xx.c
* 文件标识:无
* 内容摘要:udpclient演示程序
* 其它说明:无
* 当前版本:V1.0
* 作    者:WangSq
* 完成日期:2016
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


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

/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期        版本号     修改人            修改内容
* -------------------------------------------------------------------
* 2016xxxx       V1.0       WangSq       创建
***********************************************************************/
#define UDP_TEST_PORT       2234

#define UDP_SERVER_IP       "192.168.1.10"

#define MAX_LINE             80 

int main(int argC, char* arg[])

{

    struct sockaddr_in server;

    int sockfd, len = 0;   

    int server_len = sizeof(struct sockaddr_in);     
     
    char *sendStr ="i am a client
"; //默认发送串
    
    char buf[MAX_LINE];//接收缓冲区

    /* setup a socket,attention: must be SOCK_DGRAM */
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
   
        perror("socket");
        exit(1);
    }

 
    /*complete the struct: sockaddr_in*/
    bzero(&server, sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(UDP_TEST_PORT);
    server.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);

  //  while(1) {

        //printf("Please enter a string to send to server: 
");

        /* get the string from standard in*/

        //len = read(STDIN_FILENO, buf, sizeof(buf));

        /* send the string to server*/

        if(sendto(sockfd, sendStr,  strlen(sendStr), 0, (struct sockaddr *)&server, server_len)<0) //sizeof
        {
            printf("sendto error
");
            exit(1);
        }

        memset(buf, 0, sizeof(buf));

        /* recieve the string from server*/
       
        len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&server, &server_len);
        if(len <0)
        {
           printf("recvfrom error
");
           exit(1);
        }
        printf("Receive from server: %s
", buf);

  //  }

 

    return 0;

}
View Code

  Makefile:

all :        udpserver udpclient
udpserver: udpserver.c
    gcc udpserver.c -o udpserver
udpclient: udpclient.c
    gcc udpclient.c -o udpclient


clean:
    rm *.o udpserver udpclient

.PHONY: clean

  好久没有在这里写博客了,希望自己多多加油,多实践,多思考!

原文地址:https://www.cnblogs.com/shuqingstudy/p/7123446.html