udp通信(C 语言)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > udp通信(C 语言)

udp通信(C 语言)

 2010/11/19 9:18:39  shaojiashuai123456  http://shaojiashuai123456.javaeye.com  我要评论(0)
  • 摘要:下面给出udp通信的代码,服务器端和客户端都已经封装好,只要参考main函数中的方法使用即可。服务器端:udp_server.h/**********************************************************************文件名:udp_server.h**创建人:ss**完成日期:2010-11
  • 标签:udp通信 C语言

下面给出udp通信的代码,服务器端和客户端都已经封装好,只要参考main函数中的方法使用即可。

服务器端:

udp_server.h

/********************************************************************
** 文件名:udp_server.h
** 创建人:ss
** 完成日期:2010-11-16
********************************************************************/
#ifndef UdpServer_CONNECT_H
#define UdpServer_CONNECT_H

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
typedef struct UdpServer UdpServer;
struct UdpServer{

/*
*函数介绍:接收信息 
*输入参数:UdpServer 类型指针,msg接收消息指针,接收内存大小 
*输出参数:msg接收到的消息,返回消息长度 
*返回值:
*/
int  (*recv)(UdpServer *this,char *msg,int len);  

/*
*函数介绍:发送信息 
*输入参数:UdpServer 类型指针,发送消息指针 
*输出参数: 
*返回值:
*/
void  (*send)(UdpServer *this,char *msg); 

/*
*函数介绍:回收内存 
*输入参数:UdpServer 类型指针
*输出参数: 
*返回值:
*/    
void  (*destory)(UdpServer *this);
};
UdpServer* UdpServer_create(unsigned short port);
#endif

?

udp_server.c

??

#include "udp_server.h"
typedef struct private_UdpServer private_UdpServer;
struct private_UdpServer
{
    UdpServer public;
    int fd;
    struct sockaddr_in client;
};

static int recv_msg(private_UdpServer *this,char *msg,int len)
{
        int structlength = sizeof(struct sockaddr_in); 
        memset(&this->client,0,structlength);     
        int recvd = recvfrom(this->fd,msg,len,0,(struct sockaddr *) &this->client,&structlength);
        if(recvd < 0){
            perror("recvfrom"); 
            exit(EXIT_FAILURE);    
        }
        else{
            msg[recvd] = '\0';
        }
        return recvd;
}    

static void  send_msg(private_UdpServer *this,char *msg)
{
            int structlength = sizeof(struct sockaddr_in);    
            int snd = sendto(this->fd,msg,strlen(msg),0,(struct sockaddr *)&this->client,structlength);
            if(snd < 0){
            	perror("sendto");
            	exit(1);
            }
}  
     
static void  destory(private_UdpServer *this){                  
    free(this);
}

UdpServer* UdpServer_create(unsigned short port)
{
    private_UdpServer *this=malloc(sizeof(private_UdpServer));
    int sock;
    struct sockaddr_in server;
    int structlength;   
    memset(&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);	
    server.sin_port = htons(port);

    if((sock = socket (AF_INET,SOCK_DGRAM,0)) < 0 ){
        printf("socket create error!\n");
        exit(1);
    }
       
    structlength = sizeof(server);
    if( bind(sock,(struct sockaddr *) &server,structlength) < 0){
        printf("socket bind error!\n");
        perror("bind");
        exit(1);
    }
    this->fd = sock;
    this->public.recv=(int (*)(UdpServer *,char *,int ))recv_msg;
    this->public.send=(void (*)(UdpServer *,char *))send_msg;
	this->public.destory=(void (*)(UdpServer *))destory;
}
/*
int main()
{
    int sock;
    char msg[1024];
    UdpServer *server=UdpServer_create(8000);// 创建Udp服务器,绑定ip为本机ip,绑定端口8000端口
    while(1)
	{
       printf("wait .....\n");
       server->recv(server,msg,1024);  //接收信息
       printf("%s",msg);
       if(strcmp(msg,"exit")==0) break;
       else server->send(server,msg);  //发送信息
    }    
   server->destory(server);
}
*/

?注:使用方法在参见udp_server.c中注释掉的main函数,可去掉注释运行。

?????? 在linux下输入: gcc -o server udp_server.c udp_server.h???

?????? 便可以在当前目录下生成 server可执行文件,运行即可。

??

?

?客户端:

?? udp_client.h

??

???

#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <malloc.h>
typedef struct UdpClient UdpClient;
struct UdpClient{
/*
*函数介绍:接收信息 
*输入参数:UdpClient 类型指针,msg接收消息指针,接收内存大小 
*输出参数:msg接收到的消息,返回消息长度 
*返回值:
*/
int  (*recv)(UdpClient *this,char *msg,int len);  
/*
*函数介绍:发送信息 
*输入参数:UdpClient 类型指针,发送消息指针 
*输出参数: 
*返回值:
*/
void  (*send)(UdpClient *this,char *msg); 
/*
*函数介绍:回收内存 
*输入参数:UdpClient  类型指针
*输出参数: 
*返回值:
*/    
void  (*destory)(UdpClient *this);
};
UdpClient* UdpClient_create(char *ip,unsigned short port);
#endif

?udp_client.c

??

#include "udp_client.h"
typedef struct private_UdpClient private_UdpClient;
struct private_UdpClient
{
    UdpClient public;
    int fd;
    struct sockaddr_in server;
};

static int recv_msg(private_UdpClient *this,char *msg,int len)
{
        int structlength = sizeof(struct sockaddr_in); 
        memset(&this->server,0,structlength);           
        int recvd = recvfrom(this->fd,msg,len,0,(struct sockaddr *) &this->server,&structlength);
        if(recvd < 0){
            perror("recvfrom"); 
            exit(EXIT_FAILURE);    
        }
        else{
            msg[recvd] = '\0';
        }
        return recvd;
}    

static void  send_msg(private_UdpClient *this,char *msg)
{
            int structlength = sizeof(struct sockaddr_in);           
            int snd = sendto(this->fd,msg,strlen(msg),0,(struct sockaddr *) &this->server,structlength);
            if(snd < 0){
            	perror("sendto");
            	exit(1);
            }
}  
     
static void  destory(private_UdpClient *this){                  
    free(this);
}

UdpClient* UdpClient_create(char *ip,unsigned short port)
{
    private_UdpClient *this=malloc(sizeof(private_UdpClient));
    int sock;
    struct sockaddr_in server;
    int structlength;   
    memset(&this->server,0,sizeof(this->server));
    this->server.sin_family = AF_INET;
    this->server.sin_addr.s_addr = inet_addr(ip);	
    this->server.sin_port = htons(port);

    if((sock = socket (AF_INET,SOCK_DGRAM,0)) < 0 ){
        printf("socket create error!\n");
        exit(1);
    }
    this->fd = sock;
    this->public.recv=(int (*)(UdpClient *,char *,int ))recv_msg;
    this->public.send=(void (*)(UdpClient *,char *))send_msg;
    this->public.destory=(void  (*)(UdpClient *))destory;
}
/*
int main()
{
    int sock;
    char msg[1024];
    UdpClient *client=UdpClient_create("192.168.101.201",8000); //创建发送信息到192.168.101.201:8000的客户端
    while(1)
    {
        int len=read(0,msg,1024);
        msg[len]='\0';
        client->send(client,msg);
        client->recv(client,msg,1024);
        printf("from server:%s",msg);
    }
}
*/

?

?注:使用方法在参见udp_client.c中注释掉的main函数,可去掉注释运行。

?????? 在linux下输入: gcc -o?client udp_client.c udp_client.h???

?????? 便可以在当前目录下生成 client可执行文件,运行即可。

?

? 附件中包含全部代码

发表评论
用户名: 匿名