下面给出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可执行文件,运行即可。
附件中包含全部代码
- 大小: 1.4 KB
- 大小: 1.6 KB
分享到:
相关推荐
2. **UDP通信协议C**:这表明提供的代码或文档可能使用C语言实现了UDP通信协议。C语言是一种底层、高效的编程语言,非常适合用来编写网络通信程序。 3. **UDP接收程序**:这个压缩包可能包含了一个用于接收UDP数据...
在C/C++或Java等语言中,通过创建UDP套接字,设置相应的IP地址和端口号,实现数据的发送和接收。 3. 数据包封装与解析:学习如何将应用层的数据封装成UDP数据报,以及在接收端如何解析这些数据报,恢复原始信息。 ...
c语言UDP传输系统源码.rarc语言UDP传输系统源码.c语言UDP传输系统源码.rarc语言UDP传输系统源码.c语言UDP传输系统源码.rarc语言UDP传输系统源码.c语言UDP传输系统源码.rarc语言UDP传输系统源码.c语言UDP传输系统源码...
在IT领域,网络通信是至关重要...总结来说,通过这个项目,你可以学习到如何在C语言环境中使用基本的网络编程API来实现TCP和UDP通信。这不仅有助于理解这两种协议的工作原理,还能为构建自己的网络应用打下坚实的基础。
7. **编程接口**:在大多数编程语言中,如C、Java,都有标准的API供开发者使用,如在C中的`socket`、`bind`、`sendto`和`recvfrom`函数,Java中的`DatagramSocket`类等。 8. **UDP套接字编程**:创建UDP套接字,...
Blocksock的UDP通信验证主要涉及的是在Windows环境下利用C++编程语言,通过Winsock库实现的UDP(User Datagram Protocol)套接字通信技术。Winsock是Windows操作系统中的一个API,它为应用程序提供网络通信功能,而...
在本文中,我们将深入探讨如何在ZYNQ 7020 FPGA平台上实现以太网UDP通信。ZYNQ 7020是Xilinx公司的一款高性能、低功耗的系统级芯片(SoC),集成了ARM Cortex-A9双核处理器和可编程逻辑单元(PL),为嵌入式应用提供...
通过以上解析,我们了解了如何使用C++编写一个简单的UDP通信程序,包括客户端和服务端的实现细节。这种通信方式适用于需要快速传输数据且对数据可靠性要求不高的场景。值得注意的是,在实际开发中还需要考虑异常处理...
总的来说,"udp简单dome"项目是一个学习和实践UDP基本操作的好例子,通过它你可以掌握如何使用编程语言(可能是C、C++、Python等)实现UDP客户端和服务器,了解UDP通信的工作原理。对于初学者来说,这是理解网络编程...
这个实例可能包含服务器端和客户端的代码,演示了如何建立UDP通信。客户端发送数据到服务器,服务器接收到数据后回应。由于UDP的不可靠性,可能需要考虑重传机制,尤其是在网络环境不稳定的情况下。 通过这个实例,...
本项目“基于cpp的socket实现C:S的TCP:UDP通信样例”提供了一个使用C++编程语言实现的示例,涵盖了这两种协议的通信方式。下面将详细介绍这两个协议以及如何使用C++的socket API进行实现。 TCP是一种面向连接的、...
本文旨在介绍如何利用C#编程语言,结合.NET Framework 2.0中的UdpClient类,实现基于UDP协议的点对点即时通信。UDP(User Datagram Protocol)作为TCP/IP协议族中传输层的一种无连接协议,以其低开销、高速度的特点,...
在标题"CS_udpc#"中,"udpc#"可能指的是使用C#实现的UDP通信库或者工具。UDP(User Datagram Protocol)是传输层的一个无连接协议,相比TCP,它更轻量级,速度更快,但不保证数据的可靠传输。 描述提到"C#类,用于...
在GPRS UDP通信中,这种特性允许设备直接与远程服务器进行数据交换,如同它们之间直接相连。 GPRS UDP通信的核心是建立一个可靠的连接通道,通常通过TCP或UDP实现。本项目采用UDP协议,因为它具有更低的延迟和更高...
另一个文件“udp通信”可能是一个包含实际 UDP 通信代码的源代码文件,比如 C/C++、Java 或 Python 等。 综上所述,这个压缩包提供了一个 UDP 通信的实践示例,通过学习和理解其中的源代码,可以深入了解 UDP 协议...
使用Java语言,利用UDP通信,实现客户端与服务器之间的通信,服务器支持多客户端连接,采用多线程技术。每当客户端向服务器发送请求后,服务器将为客户端发送文件。
### Linux C语言与PHP通过UDP协议进行通信 #### 背景介绍 在现代软件开发中,不同编程语言之间的通信是非常常见的需求。本案例展示了一个简单的C语言服务器(server.c)与PHP客户端(client.php)之间如何通过用户...
1. **Objective-C或Swift**: iOS应用的开发语言通常是Objective-C或Swift,两者都是苹果提供的编程语言。本项目可能使用了其中的一种,因为它们都支持创建iOS应用,并且能处理网络通信和用户界面。 2. **UIKit**: ...
5. `udpcs.h`:可能包含通用的UDP通信相关的函数和结构体定义,如套接字创建、数据包发送和接收等。 6. `gbn_server_res.txt` 和 `gbn_client_res.txt`:这些可能是运行结果文件,记录了服务器和客户端在执行GBN协议...