基于UDP的通讯

XX:那飘过的100~_~{2014/10/03 10:57}

UDP是一种面向非连接SOCK_DGRAM,提供无连接服务。数据包以独立包形式发送,不提供无措保证,数据能够丢失或反复。

UDP的Server和Client的差别相对照较模糊,仅仅要调用 sendto和 recvfrom 就能够给指定的地址收发数据。

1. server端:

// udpClient.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "tchar.h"

#pragma comment(lib,"wsock32.lib")
#include <stdio.h>
#include <winsock2.h>

BOOL InitWinsock();				//Winsock服务初始化

void main()
{

	SOCKET socket1;
	InitWinsock();
	struct sockaddr_in local;
	struct sockaddr_in from;
	int err;
	int fromlean=sizeof(from);

	local.sin_family=AF_INET;
	local.sin_port=htons(1234);					//监听端口
	local.sin_addr.S_un.S_addr=INADDR_ANY;		//本机
	socket1=socket(AF_INET,SOCK_DGRAM,0);

	bind(socket1,(sockaddr *)&local,sizeof local);
	while(true)
	{
		char buffer[1024]="\0";
		printf("waiting for message from others \n");

		err=recvfrom(socket1,buffer,sizeof(buffer),0,(sockaddr *)&from,&fromlean);
		if(err!=SOCKET_ERROR)
		{

			printf("Received from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
			//给Client发信息
			sendto(socket1,buffer,sizeof buffer,0,(sockaddr *)&from,fromlean);
		}
		Sleep(500);
	}
	closesocket(socket1);
}

BOOL InitWinsock()
{
	int Error;
	WORD Version;
	WSADATA Wsa;
	Version=MAKEWORD(2,2);
	Error=WSAStartup(Version,&Wsa);

	if(Error!=0)
	{
		return FALSE;
	}
	else
	{
		if(LOBYTE(Wsa.wVersion)!=2 || HIBYTE(Wsa.wHighVersion)!=2)
		{
			WSACleanup();
			return FALSE;
		}
	}
	return TRUE;
}

2.client

// udpClient.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "tchar.h"

#pragma comment(lib,"wsock32.lib")
#include <stdio.h>
#include <winsock2.h>

BOOL InitWinsock();				//Winsock服务初始化

void main()
{

	SOCKET socket1;
	InitWinsock();
	struct sockaddr_in server;
	int err;
	int lean=sizeof(server);
	server.sin_family=AF_INET;
	server.sin_port=htons(1234);								//服务器的监听端口为1234
	server.sin_addr.S_un.S_addr=inet_addr("192.168.1.18");		//设置为本机地址
	socket1=socket(AF_INET,SOCK_DGRAM,0);
	while(true)
	{
		char buffer[1024]="\0";
		printf("input message \n");
		scanf("%s",buffer);

		if(strcmp(buffer,"bye")==0)
		{
			break;
		}
		err=sendto(socket1,buffer,sizeof(buffer),0,(sockaddr *)&server,lean);
		if(err!=SOCKET_ERROR)
		{

			err=recvfrom(socket1,buffer,sizeof(buffer),0,(sockaddr *)&server,&lean);
			if(err!=SOCKET_ERROR)
			{

				printf("receive from server:%s\n",buffer);
			}
		}
	}
	closesocket(socket1);
}

BOOL InitWinsock()
{
	int Error;
	WORD Version;
	WSADATA Wsa;
	Version=MAKEWORD(2,2);
	Error=WSAStartup(Version,&Wsa);

	if(Error!=0)
	{
		return FALSE;
	}
	else
	{
		if(LOBYTE(Wsa.wVersion)!=2 || HIBYTE(Wsa.wHighVersion)!=2)
		{
			WSACleanup();
			return FALSE;
		}
	}
	return TRUE;
}

启动client以及server端,查看执行效果:

程序仍然存在非常大的问题,慢慢改动咯!

时间: 2024-11-05 02:07:14

基于UDP的通讯的相关文章

TwinCAT 3中基于UDP协议通讯的C++实现

因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识.这个做个简单的笔记,方便以后查询. 1 概述 倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函数 “TCP/UDP Realtime”, 这个访问要么来自PLC(61131-3), 要么来自C++.这个函数对使用以下协议进行的通讯提供支持: TCP/IP UDP/IP ARP/Ping TC3中使用该函数实现网络通信的示意图如下所示: 不管使用何种协议, 在基于该协议的项目和TC3之间的通讯

10 线程 协程 socketserver 基于udp的socketserver

线程进程 操作系统的作用: 1.把硬件丑陋复杂的接口隐藏起来,为应用程序提供良好接口 2.管理,调用进程,并且把进程之间对硬件的竞争变得有序化 多道技术: 1.产生背景:为了实现单cpu下的并发效果 2.分为两部分: 1:空间上的复用(必须实现硬件层面的隔离) 2:时间上的复用(复用cpu的时间片) 什么切换? 1:正在执行的任务遇到的阻塞 2:正在执行的任务运行时间过长 进程:正在运行的一个过程/一个任务,由操作系统负责调用,然后由cpu负责执行程序:就是程序员写的代码并发:伪并行,单核+多道

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③  

socket 网络编程快速入门(二)教你编写基于UDP/TCP的服务端多线程通信

在上一篇博文中,我们介绍了利用socket进行简单的UDP/TCP的服务端和客户端的通信. (一) 在基于UDP的程序中,你有没有想过,如果我的这台主机在通讯的时候要求既能够收到别的主机发来的数据,又能够自己向目的主机发出数据,该怎样实现?也就是说需要两个while循环同时进行.答案是使用多线程,一个线程用于接受数据,另一个线程用来发送数据.接下来我们介绍WinSock的多线程编程. 多线程的实现我们使用_beginthread()函数: uintptr_t _beginthread( void

Raknet是一个基于UDP网络传输协议的C++网络库(还有一些其它库,比如nanomsg,fastsocket等等)

Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络传输服务.通常情况下用于游戏,但也可以用于其它项目. Raknet有以下好处: 高性能 在同一台计算机上,Radnet可以实现在两个程序之间每秒传输25,000条信息: 容易使用 Raknet有在线用户手册,视频教程.每一个函数和类都有详细的讲解,每一个功能都有自己的例程 跨平台,当前Raknet支持Windows, Linux, Macs,可以建立在Visual Studio, GCC, Code

python学习_day31_基于udp协议编程

一.作业解析 基于tcp文件流协议执行客户端的下载命令. 服务端: from socket import * import json import struct import os import hashlib def get(filename,conn): header_dic={ 'filename':os.path.basename(filename), #获得去除路径的纯文件名 'data_size':os.path.getsize(filename) #获得文件的字节大小 } head

网络编程[第二篇]基于udp协议的套接字编程

udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息,只需自己发送了即可 二.客户端 import socket #买手机 -- 套接字家族 | 端口协议 phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #服务端地址 ip_port = ('127.0.0.1',8001) #实现多次发送

102 基于UDP协议的socket套接字

目录 一.基于UDP协议的socket套接字编程 1.1 用法 1.2 udp协议的特点 1.3 实例 一.基于UDP协议的socket套接字编程 socket套接字包括使用TCP协议和UDP协议进行通讯 1.1 用法 socket指定使用UDP通讯协议server = socket.socket(socket.AF_INET, type=socket.SOCK_DGRAM) 发送udp数据server.sendto(发送数据) 接收udp数据data, addr = server.recvfr

基于UDP的Winsock编程(C++版)

基于UDP的Winsock编程与基于TCP的Winsock编程相比,只是缺少了一个步骤而已.对于Server,缺少了接受连接的过程(accept()函数调用):对于Client,缺少了请求连接的过程(connect()函数调用). 另外与TCP区别的还有,在UDP中,数据收发函数是:sendto(),和recvfrom()函数. 函数原型为: int sendto(SOCKET s,const char FAR *buf,int len,int flags,const struct sockad