网络 基于UDP协议的socket编程

一、UDP协议

       UDP协议的特点:用户数据包协议

            1、UDP协议是无连接的。也就说在数据发送之前并不需要建立连接(当然,在发送数据结束的时候也就不存在链接的释放),因此减少了开销和数据发送之前的时延。

            2、UDP使用尽最大努力的交付,但是不保证可靠性的交付,因此主机不需要维持复杂的链接状态表。(网上的的可靠性建立在应答的基础上,不提供可靠性交付,即不需要应答,因此不需要维护状态表)

            3、UDP是面向报文。发送方的UDP对于应用程序进程交下来的报文,即不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交付给UDP多长的报文,UDP就照样发送,即一次发送一个报文。同时,在接收方,对于IP层交上来的UDP用户数据报,在去除首部后就原封不动的交付给应用层的应用进程了。也就说,UDP一次交付一个完整的报文。因此报文的大小必须合适,负责会降低数据的传输效率。如果报文太长,在IP层需要对报文分片,就会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使得IP数据报的首部相对过长,同样会降低IP层的效率。

            4、UDP没有拥塞控制

二、基于UDP的socket编程的一般流程

        1.server端

            a.获取有效的IP地址与端口号(port)(服务器端需要约定好的端口号与IP,方便客户直接与该IP下的该端口建立连接)

            b.将IP与port转为网络通用格式

            c.声明监听文件描述符 (int listen_sock),将该文件描述符”注册“为

套接字文件(listen_sock=socket(AF_INET,SOCK_DGRAM,0))

           参数:

            AF_INET:IPv4套接字类型(说明地址类型格式)

            SOCK_DGRAM:UDP协议类型(提供无连接的尽力交付)

            0:表示该套接字只支持一种协议

            d.给listen_sock绑定相应的信息( IP,port),因为socket套接字是由内核接管处理的,因此我们无法直接操作,写入信息需要以下操作:

            1>声明struct sockaddr_in 结构体,将对因信息赋值给结构体对应单元

                 local.sin_family=AF_INET;

                local.sin_port=htons(port);

                local.sin_addr.s_addr=ip;

            2>调用bind(int sockfd,struct sockaddr* addr,socklen_t addrlen)函数,将ip,port信息写入(即绑定)套接字的

            f.使用recvfrom()接收数据。

            server端代码实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
void usage(char* arg)
{
	printf("Missing Parameters: %s [remote ip :] [remote port :]",arg);
}
int main(int argc,char* argv[])
{
	if(argc!=3){
		usage(argv[0]);
		exit(1);
	}
	in_addr_t _ip=inet_addr(argv[1]);
	int _port=atoi(argv[2]);
	int sock=socket(AF_INET,SOCK_DGRAM,0); 
	struct sockaddr_in server;
	socklen_t len=sizeof(server);
	server.sin_family=AF_INET;
	server.sin_port=_port;
	server.sin_addr.s_addr=_ip;
	if(bind(sock,(struct sockaddr*)&server,len)<0){
		perror("bind");
		exit(2);
	}
	char buf[1024];
	while(1){
		ssize_t size=recvfrom( sock,buf, 1023,0,			(struct sockaddr *)&server, &len);

		if(size<0){
			perror("read");
			break;
		}else if(size==0){
			printf("server %d close: ip: %s !\n",sock,inet_ntoa(server.sin_addr));
		}
		else{
			printf("get a connect %d... ip:%s,port:%d\n",sock				,inet_ntoa(server.sin_addr),ntohs(server.sin_port));
			buf[size]=0;
			printf("server# %s\n",buf);
		}

	}
	return 0;
}

    2.client端

            a.获取有效的IP地址与端口号(port)(此处为需要发送的目标服务器的ip,与广知的port)

            b.将IP与port转为网络通用格式

            c.声明文件描述符 (int _sock),将该文件描述符”注册“为

套接字文件(_sock=socket(AF_INET,SOCK_DGRAM,0))

            d.声明struct sockaddr_in _server结构体,connect()将目标服务器ip与port写入使用,并与_sock绑定,同时与目标服务器建立连接。

            

     e.使用sendto()向目标发送UDP报文。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <arpa/inet.h>
void usage(char* arg)
{
	printf("Missing Parameters: %s [remote ip :] [remote port :]",arg);
}
int main(int argc,char* argv[])
{
	if(argc!=3){
		usage(argv[0]);
		exit(1);
	}
	in_addr_t _ip=inet_addr(argv[1]);
	int _port=atoi(argv[2]);

	int sock=socket(AF_INET,SOCK_DGRAM,0);
	if(sock<-1){
		perror("socket");
		exit(2);
	}
	struct sockaddr_in server;
	socklen_t len=sizeof(server);
	server.sin_family=AF_INET;
	server.sin_port=_port;
	server.sin_addr.s_addr=_ip;
	if( connect( sock, (struct sockaddr *)&server, len)<0){
		perror("connect");
		exit(3);
	}
	char buf[1024];

	while(1){
		printf("please Enter:");
		gets(buf);
		if(strcmp(buf,"quit")==0){
			sendto(sock, buf,0,0 ,(struct sockaddr *)&server, len);
			break;
		}
		sendto(sock, buf,strlen(buf),0 ,(struct sockaddr *)&server, len);
	}
	close(sock);
	return 0;
}




时间: 2024-07-31 01:10:29

网络 基于UDP协议的socket编程的相关文章

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

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

基于UDP协议之——socket编程

一. socket API 前面一篇<基于TCP协议之--socket编程>http://2627lounuo.blog.51cto.com/10696599/1775559已经花了大量的篇幅讲述了socket和使用基本的socket API所需要注意的问题,这里就不再赘述了.下面主要谈论的是UDP和TCP在socket编程中的不同之处: 1. 创建sock 和TCP面向连接的可靠的字节流传输服务不同的是,UDP是无连接的不可靠的数据报传输服务:虽然有所不同,但同样在进程间通信的时候需要提供出

基于UDP协议的socket编程

UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启动服务端. 2.不可靠.数据在本地通过网络发出之后,UDP协议会立即清除本地的缓存,即使对方没有收到该数据,也不做任何补救措施. 3.数据报协议. 代码示例: 1 import socket 2 server = socket.socket(socket.AF_INET,socket.SOCK_DG

基于UDP协议的socket编程示例

客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class LoginClient { public static void main(Str

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

基于UDP协议 的socket套接字编程 1.UDP套接字简单示例 1.1服务端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 建立一个UDP协议的服务器 server.bind(("127.0.0.1",8080)) while True: data,addr = server.recvfrom(1024) server.sendto(data.upper(),addr) server

基于UDP协议的socket套接字编程

基于UDP协议的socket套接字编程 一.UDP套接字简单示例 1.1 服务器 import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议->UDP server.bind(('127.0.0.1', 8080)) while True: data, client_addr = server.recvfrom(1024) print('===>', data, client_addr) ser

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

Android基础入门教程——7.6.4 基于UDP协议的Socket通信

Android基础入门教程--7.6.4 基于UDP协议的Socket通信 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家带来Socket的最后一节:基于UDP协议的Socket通信,在第一节中我们已经详细地 比较了两者的区别,TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行 数据传输,如果你学了前两节TCP的,传输前先开服务端,accept,等客户端接入,然后获得 客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,

网络编程: 基于UDP协议的socket

udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 原文地址:https://www.cnblogs.com/niuli1987/p/9470035.html