Linux下UDP一發一收通訊

  實如今Linux環境下的UDP通訊測試。服務器

       註釋了while循環,將代碼規範化。socket

       udpserver.c代碼:ide

/**********************************************************************
* 版權全部 (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.\n";
/**********************************************************************
* 功能描述:主函數
* 輸入參數:無
* 輸出參數:無
* 返 回 值:無
* 其它說明:無
* 修改日期        版本號     修改人            修改內容
* -------------------------------------------------------------------
* 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\n");
           exit(1);
        }
        /*打印客戶端地址和端口號*/
        inet_ntop(AF_INET,&client.sin_addr,addr_p,sizeof(addr_p));
        printf("client IP is %s, port is %d\n",addr_p,ntohs(client.sin_port));
        message[recv_len]='\0';
        /*顯示消息長度*/
        printf("server received %d:%s\n", recv_len, message);

        /********************************回發數據*************************/ 
        if(sendto(sockfd,sndbuf,strlen(sndbuf),0,(struct sockaddr*)&client,client_len)<0)
        {
           printf("sendto error\n");
           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\n"; //默認發送串
    
    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: \n");

        /* 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\n");
            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\n");
           exit(1);
        }
        printf("Receive from server: %s\n", 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

  很久沒有在這裏寫博客了,但願本身多多加油,多實踐,多思考!spa

相關文章
相關標籤/搜索