网络 UDP通信

本文详细介绍了基于UDP协议的服务器端与客户端通信模型,包括socket创建、bind、数据收发以及recvfrom和sendto系统调用的使用。通过实例展示了如何创建和交互UDP套接字,适合初学者理解基本的网络编程原理。
摘要由CSDN通过智能技术生成

网络编程2

udp通讯

udp 通信图片

基于Udp 编程:

服务器端
  1. 创建socket ,返回该设备的文件描述符
  2. 将fd 和本地的ip 地址 端口号 绑定
    while (1)
    1. 使用 recvfrom(2)阻塞等待客户端请求数据的到来
    2. 处理客户端的请求
    3. 将处理结果返回给客户端 sendto(2)
  3. 关闭fd
客户端模型
  1. 创建socket 设备
  2. 使用sendto(2) 向服务器发送消息
  3. 使用recvfrom(2)阻塞等待服务器 的相应消息
  4. 处理响应消息
  5. 关闭fd
udp 系统调用
recvfrom

#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:从一个socket 设备上接收一条消息
参数 :
sockfd : 就是socket 设备,从这个设备上接收一条消息
buf : 将接收到的消息存储到buf 指定的地址空间中
len : buf中指定的地址空间的大小
flags : 0
src_addr : 将消息的源地址保存在这里
addrlen : 值-结果参数
如果对消息的源地址不感兴趣, src_addr 和addr_len 可以置空

返回值
失败 -1 errno
成功 返回接收到的字节数

sendto

#include <sys/types.h>
#include <sys/socket.h>

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);

功能:在指定的socket 设备上发送一条消息
参数 :
sockfd : 指定socket 设备
buf : 将buf 中的数据发送出去
len : 指定要发送的字节数
flags : 0
dest_addr: 指定目标地址
addrlen : 指定dest_addr 空间的大小
如果对消息的源地址不感兴趣, src_addr 和addr_len 可以置空

返回值
失败  -1 errno 
成功 返回接收到的字节数

客户端简短示例

#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <string.h>
//#define DEBUG
#include <t_net.h>
int main(int argc, char * argv[])
{
	printf("socket");
	char *str = "this is a test...\n";
	int sfd,ret;
	char buf[128];
	SA4 serv;
	serv.sin_family= AF_INET;
	serv.sin_port = htons(3344);
	inet_pton(AF_INET,argv[1],&serv.sin_addr);	
	D_BUG("socket");
	sfd = socket(AF_INET,SOCK_DGRAM,0);
	sendto(sfd, str, strlen(str) + 1, 0,(SA*)&serv,sizeof(serv));
	int r = recvfrom(sfd, buf, 128, 0,NULL, NULL);
	write(1,buf,r);
	close(sfd);
	return 0;

}
服务器端简单示例
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>

extern int t_main(int fd);


int main(int argc, char * argv[])
{
	int sfd,cfd,r;
	char buf[128];
	SA4 cli ;
	socklen_t len = sizeof(cli);
	sfd=s_bind(SOCK_DGRAM,3344);
	D_BUG("s_bind");
	if (sfd == -1){
		perror("s_listen");
		return -1;
	}
	while (1)
	{
		r = recvfrom(sfd, buf, 128, 0,(SA*)&cli, &len);
		if (r > 0) {
			for(int i=0;i < r;i++)
			{
				buf[i]= toupper(buf[i]);
			}
		}	
		sendto(sfd, buf, 128, 0,(SA*)&cli, sizeof(cli));	
	}
	close(cfd);

	return 0;	

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值