UDP编程

TCP的API补充:

1.send()函数

ssize_t send(int sockfd,

const void *buf,

size_t len,

int flags

);

。参数:

■ sockfd:socket函数返回的fd

■ buffer:发送缓冲区首地址

I

■ length:发送的字节

■ flags:发送方式(通常为0),作用和write一样

■ MSG_DONTWAIT,非阻塞

■ MSG_OOB:用于TCP类型的带外数据(out of band)

返回值:

。 成功:实际发送的字节数

。 失败:-1,并设置errno

网络中接收数据:

2.recv()/read()

• int recv( SOCKET s, char FAR *buf, int len, int flags);

o flag:一般填0,和read作用一样

。 特殊的标志:

■ MSG_DONTWAIT

■ MSG_OOB:读取带外数据

■ MSG_PEEK:流

bind:绑定服务器:TCP地址和端口号

receivefrom():阻塞等待客户端数据

sendto():指定服务器的IP地址和端口号,要发送的数据

无连接尽力传输,UDP:是不可靠传输

实时的音视频传输,DNS域名解析包

复制代码
#include <stdto.hs
#include <stdltb.h>
#include <unistd.h>
#include <string.h>
#include <strings.har
#include<sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERV_PORT 5001
#define SERV_IP_ADDR192.168.182.144"
#define BUFSIZE 1024
#define QUIT_STR "QUIT"
int main()
{
	int fd = -1;
	struct sockaddr_in sin;
	//1.socket
	fd = socket(AF_INET, SOCK_DGRAM, 0);
	if(fd <0)
	{
		perror("socket");
		exit(1);
	}
	int b_reuser=1;

	//2.addr
	setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &b_ reuser, sizeof(int));

	//bind
	bzero(&sin, sizeof(sin));

	sin.sin_family = AF_INET;
	sin.sin port = htons(SERV_PORT);
	sin.sin addr.s_addr = htonl(INADDR_ANY);

	if(bind(fd, (struct sockaddr*)&sin, sizeof(sin)) <6)
	{
		perror("bind");
		exit(1);
	}

	char buf[BUFSIZE];
	struct sockaddr_in cin;
	socklen_t addrlen = sizeof(cin);
	while(1)
	{
		bzero(buf, BUFSIZE);
		if(recvfrom(fd.buf, BUFSIZE-1, 0, (struct sockaddr*)&cin, &addrlen)<0)
		{	
			perror("recvfrom");
			continue;
		}
		char ipv4_addr[16];
		if(!inet_ntop(AF_INET, (vold *)&cin.sin_addr, tpv4_addr, sizeof(cin)))
		{
			perror("inet_ntop");
			exit(1);
		}
		printf("receive from(%s, %d), data:%s\n", tpv4_addr, ntohs(cin.sin_port), buf);

		if(!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)))
		{
		printf(cltent(%s:%d)is exiting!\n", ipv4_addr,ntohs(cin.sin_port));
		}
	}	
	close(fd);
	return 0;
}

UDP客户端

复制代码
#include <stdto.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#define SERV_PORT 5001
#define SERV IP_ADDR "192.168.182.144"
#define QUIT_STR"QUIT"
#define BUFSIZE 1024
int main(int argc,char**argv)
{
	if(argc != 3)
	{
		exit(1);
	}
	int fd =-1;
	fd = socket(AF_INET, SOCK_ DGRAM, 0);
	if(fd <0)
	{	
		perror("socket");
		exit(1);
	}
	int port = -1;	
	port = atoi(argv[2]);
	struct sockaddr_in sin;
	bzero(&sin, sizeof(sin));
	sin.sin family = AF INET;
	sin.sin_port = htons(port);
	sin.sin_addr.s_addr= inet_addr(argv[1]);
	char buf[BUFSIZE];
	while(1)
	{
		if(fgets(buf, BUFSIZE-1, stdin) == NULL)
		{
			perror("fgets");
			continue;
		}
		sendto(fd, buf, strlen(buf), 0, (struct sockaddr*)&sin, sizeof(sin));
		if(!strncasecmp(buf, QUIT_STR, strlen(QUIT_STR)))
		{
			printf("client is extted!\n");
			break;
		}
	}
	close(fd);
	return 0;
}
相关推荐
tokepson15 分钟前
Mysql下载部署方法备份(Windows/Linux)
linux·服务器·windows·mysql
zz_nj2 小时前
工作的环境
linux·运维·服务器
极客先躯3 小时前
如何自动提取Git指定时间段的修改文件?Win/Linux双平台解决方案
linux·git·elasticsearch
suijishengchengde4 小时前
****LINUX时间同步配置*****
linux·运维
qiuqyue4 小时前
基于虹软Linux Pro SDK的多路RTSP流并发接入、解码与帧级处理实践
linux·运维·网络
切糕师学AI4 小时前
Linux 操作系统简介
linux
南烟斋..5 小时前
GDB调试核心指南
linux·服务器
爱跑马的程序员5 小时前
Linux 如何查看文件夹的大小(du、df、ls、find)
linux·运维·ubuntu
oMcLin7 小时前
如何在 Ubuntu 22.04 LTS 上部署并优化 Magento 电商平台,提升高并发请求的响应速度与稳定性?
linux·运维·ubuntu
Qinti_mm7 小时前
Linux io_uring:高性能异步I/O革命
linux·i/o·io_uring