下面给出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
分享到:
相关推荐
使用Java语言,利用UDP通信,实现客户端与服务器之间的通信,服务器支持多客户端连接,采用多线程技术。每当客户端向服务器发送请求后,服务器将为客户端发送文件。
这个是本人亲自编写的一个UDP类型的socket通信的实例,采用C、C++语言,可以跟QQ一样在客户端与服务器进行通信,但是只是控制台类型的,供大家参考与学习
语言为C++,在单机上模拟UDP可靠通信,使用选择性重传协议.
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考,具体如下: 一 代码 1、接收端 import socket #使用IPV4协议,使用UDP协议传输数据 s=socket.socket(socket.AF_INET, socket.SOCK_...
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
基于UDP网络广播,实现了基本的广播功能,运行平台式qt4.3.0,语言为c语言
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
主要介绍了C语言编写基于TCP和UDP协议的Socket通信程序示例,其中TCP的客户端与服务器端采用多线程实现,需要的朋友可以参考下
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
网络课程实验,实现通信双方的信息交流,简单易懂,是QQ交流信息的基础
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目...
使用C(或C++)等语言编写网络通信模拟程序,它由 client 和 server 两部分组成, client 和 server 之间的通信基于 TCP 或者UDP协议,要求能够实现客户和服务器端的交互对话
TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层...
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。...
信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。 HP-Socket 对通信层完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合...