Linux 网络编程详解十二
UDP的特点
--无连接
--基于消息的数据传输服务
--不可靠
--UDP更加高效
UDP注意点
--UDP报文可能会丢失,重复
--UDP报文可能会乱序
--UDP缺乏流量控制(UDP缓冲区写满之后,没有流量控制,会覆盖缓冲区)
--UDP协议数据报文截断(如果接收到的数据报文大于缓冲区,报文可以被截断,后面部分丢失)
--recvfrom返回0,不代表连接关闭(实际上UDP是无连接的),sendto可以发送数据0包,只含有UDP头部
--UDP客户端也可以调用connect,但是并没有完成三次握手,只是维护了一个状态信息(和对等方的)
--一旦调用了connect,就可以使用send函数
//UDP协议客户端
#define SETNO 0 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <termios.h> /**
* clear_back - 退格不回显
* 成功返回0,失败返回-1
* */
int clear_back()
{
struct termios term;
memset(&term, , sizeof(term));
//获取当前系统设置
if (tcgetattr(STDIN_FILENO, &term) == -)
{
perror("tcgetattr() err");
return -;
}
//修改系统设置
term.c_cc[VERASE] = '\b';
//立即生效
if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -)
{
perror("tcgetattr() err");
return -;
}
return ;
} int main(int arg, char *args[])
{
if(clear_back()!=)
return -;
int sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd == -)
{
perror("socket() err");
return -;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
//连接的服务器地址
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
#if SETNO==0
/*
* UDP客户端也可以调用connect,但是并没有完成三次握手,
* 只是维护了一个状态信息(和对等方的),所以发送报文时,不需要传服务器ip*/
if(connect(sockfd,(struct sockaddr *)&addr,sizeof(addr))==-)
{
perror("connect() err");
return -;
}
#endif
char buf[] = { };
int rc = ;
while (fgets(buf, , stdin) != NULL)
{
#if SETNO==0
rc = send(sockfd, buf,strlen(buf),);
#else
rc = sendto(sockfd, buf, strlen(buf), , (struct sockaddr *) &addr,
sizeof(addr));
#endif if (rc == -)
{
perror("sendto() err");
break;
}
memset(buf, , );
rc = recvfrom(sockfd, buf, , , NULL, NULL);
if (rc == -)
{
perror("recvfrom() err");
break;
}
fputs(buf, stdout);
memset(buf, , );
}
return ;
}
//UDP协议服务器端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main(int arg, char *args[])
{
int sockfd = socket(AF_INET, SOCK_DGRAM, );
if (sockfd == -)
{
perror("socket() err");
return -;
}
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons();
//绑定本地IP地址
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (bind(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -)
{
perror("bind() err");
return -;
}
int rc = ;
char buf[] = { };
struct sockaddr_in peeraddr;
socklen_t peerlen = sizeof(peeraddr);
while ()
{
memset(buf,,sizeof(buf));
do
{
rc = recvfrom(sockfd, buf, , , (struct sockaddr *) &peeraddr,
&peerlen);
} while (rc == - && errno == EINTR);
if (rc == -)
{
perror("recvfrom() err");
break;
}
//fputs()函数必须以'\n'结尾才会打印在终端上,,否则需要清空缓冲区
fputs(buf, stdout);
fflush(stdout);
//发送数据
rc = sendto(sockfd, buf, rc, , (struct sockaddr *) &peeraddr,
sizeof(peeraddr));
if (rc == -)
{
perror("sendto() err");
break;
}
}
return ;
}
.SUFFIXES:.c .o
CC=gcc
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
EXEC=ser
SRCS1=tec01.c
OBJS1=$(SRCS1:.c=.o)
EXEC1=clt start:$(OBJS) $(OBJS1)
$(CC) -o $(EXEC) $(OBJS)
$(CC) -o $(EXEC1) $(OBJS1)
@echo "^_^-----OK------^_^"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)
Linux 网络编程详解十二的更多相关文章
- Linux 网络编程详解十
select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *tim ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- Linux 网络编程详解九
TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...
- Linux 网络编程详解二(socket创建流程、多进程版)
netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...
- Linux 网络编程详解五(TCP/IP协议粘包解决方案二)
ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...
- Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...
- Linux 网络编程详解十一
/** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...
- Linux 网络编程详解八
TCP/IP协议三次握手机制 TCP/IP是全双工通道,两端都可以读写,三次握手机制就是验证TCP/IP是否是全双工通道 1.客户端调用connect()函数,阻塞客户端进程,客户端向服务器发送数据包 ...
- Linux 网络编程详解四(流协议与粘包)
TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
随机推荐
- 接口测试中三种传参请求(Map、request、Integer)解析
注册企业接口传入的是一个request,查询企业接口传入的是一个integer:根据名称和国家名称模糊匹配接口传入的是一个Map:针对三种不同的传参我怎么作接口测试呢? 1 package com.w ...
- 在【Xamarin+Prism开发详解三:Visual studio 2017 RC初体验】中分享了Visual studio 2017RC的大致情况,同时也发现大家对新的Visual Studio很是感兴趣。于是发时间深入研究了一下Visual Studio 2017RC 是不是和微软Connect()://2016上说得一样神。
总共列出了12点,耐心点慢慢看! 1,添加了不少[代码样式]的设置项目. 通过合理的设置每个人都能写出优美的代码,而且团队项目也可以达到统一代码风格. this首选项:可以设置[字段,属性,方法,事件 ...
- 每日Scrum(7)
今天是小组用来写文稿的日子,包括软件需求分析报告,概要设计报告,详细设计报告,数据库设计报告,软件测试报告,各组员领取自己的任务然后完成~
- [20140711] SQL Server page还原
create DATABASE T --数据库不能是简单模式 go USE t GO )) GO INSERT INTO dbo.t ( value ) VALUES ( ) ) BACKUP DAT ...
- Sqlite学习笔记(二)&&性能测试
测试目标 获取SQlite的常规性能指标 测试环境 CPU:8核,Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz 内存:16G 磁盘:SSD Linux 2.6.32 ...
- Hadoop+MongoDB的四种方案
背景: 公司核心业务库现存在MongoDB中,分布在6台MongoDB节点.现面临如下问题: 1.最大的一张表有10多个G,MongoDB在查询方面尚能胜任,但是涉及到复杂计算时会比较吃力. 2.Mo ...
- iOS 读取相册二维码,兼容ios7(使用CIDetector 和 ZXingObjC)
ios从相册读取二维码,在ios8以上,苹果提供了自带的识别图片二维码的功能,这种方式效率最好,也是最推荐的,但是如果你的系统需要向下兼容ios7,就必须用其他方式. 这里我选择的是 ZXingObj ...
- dpdk在虚拟机上出错处理
目录 1. 所用系统与软件版本 2. 虚拟机配置 3. Ubuntu 12.04上的配置 3.1 准备 3.2 通过setup脚本进行配置 3.3 通过命令配置 4. CentOS 7.0上的配置 4 ...
- linux 添加用户、权限
# useradd –d /usr/sam -m sam 此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录). 假 ...
- Windows Azure 虚拟机备份
如果我们要在Windows Azure的虚拟机上进行一些“重要且高危”的操作,我们通常会想到使用快照或者备份功能.但是在Windows Azure上是没有虚拟机快照功能的,尽管我们可以对虚拟机的磁盘文 ...