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 网络编程详解十二的更多相关文章

  1. Linux 网络编程详解十

    select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *tim ...

  2. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  3. Linux 网络编程详解九

    TCP/IP协议中SIGPIPE信号产生原因 .假设客户端socket套接字close(),会给服务器发送字节段FIN: .服务器接收到FIN,但是没有调用close(),因为socket有缓存区,所 ...

  4. Linux 网络编程详解二(socket创建流程、多进程版)

    netstat -na | grep " --查看TCP/IP协议连接状态 //socket编程提高版--服务器 #include <stdio.h> #include < ...

  5. Linux 网络编程详解五(TCP/IP协议粘包解决方案二)

    ssize_t recv(int s, void *buf, size_t len, int flags); --与read相比,只能用于网络套接字文件描述符 --当flags参数的值设置为MSG_P ...

  6. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

  7. Linux 网络编程详解十一

    /** * read_timeout - 读超时检测函数,不含读操作 * @fd:文件描述符 * @wait_seconds:等待超时秒数,如果为0表示不检测超时 * 成功返回0,失败返回-1,超时返 ...

  8. Linux 网络编程详解八

    TCP/IP协议三次握手机制 TCP/IP是全双工通道,两端都可以读写,三次握手机制就是验证TCP/IP是否是全双工通道 1.客户端调用connect()函数,阻塞客户端进程,客户端向服务器发送数据包 ...

  9. Linux 网络编程详解四(流协议与粘包)

    TCP/IP协议是一种流协议,流协议是字节流,只有开始和结束,包与包之间没有边界,所以容易产生粘包,但是不会丢包. UDP/IP协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...

随机推荐

  1. css控制标题长度超出部分显示省略号

    width: 50px; overflow:hidden;white-space:nowrap; text-overflow:ellipsis; 设置或检索是否使用一个省略标记(...)标示对象内文本 ...

  2. 使用git的分支功能实现定制功能摘取与组合的想法

    前言,这个想法应该是git比较通用的做法,只是我还没用过,所以把自己的想法记录在这里,督促自己以后按这个方式执行. 我们公司现在面临一个问题, 就是客户的定制需求很多,很杂,其中坑爹需求很多. 我还没 ...

  3. Apache 反向代理实现为http添加https的外衣

    Apache 反向代理 金天:坚持写东西,不是一件容易的事,换句话说其实坚持本身都不是一件容易的事.如果学习有捷径,那就是不断实践,不断积累.写笔记,其实是给自己看的,是体现积累的一种方式,要坚持. ...

  4. 将long数字序列化为json时,转换为字符串

    由于javascript中所有数字都是64位的浮点数,所以整数只能精确的表示53bit长的数字. 在从server得到的json数据中,有ID是长整数类型,在客户端根据此ID生成的link也是不准确的 ...

  5. jQuery自动完成组建Autocomplete

    一,属性介绍 * minChars (Number) 在触发autoComplete前用户至少需要输入的字符数.Default: 1,如果设为0,在输入框内双击或者删除输入框内内容时显示列表* wid ...

  6. my_strcmp()

    void my_strcmp(const char* s1,const char* s2){ int i=0; while(*(s1+i)!='\0'||*(s2+i)!='\0'){ if(*(s1 ...

  7. getaddrinfo function

    The getaddrinfo function provides protocol-independent translation from an ANSI host name to an addr ...

  8. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0

    作者:小波 QQ:463431476 请关注我的博客园:http://www.cnblogs.com/xiaobo-Linux/ 我的第二款软件:CET四六级单词背诵软件.基于QT5.5.0.sql数 ...

  9. redis安装及基础操作(1)

    ============================================================= 编译安装 0.环境 Linux:centos6.5 redis:3.0.5 ...

  10. Windows Azure IP地址详解

    Windows Azure上的IP地址有以下几种: 公网IP地址 VIP ILPIP Reserved IP 内网IP地址 DIP Static IP VIP是动态分配的公网IP,VIP可以被分配到云 ...