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协议是数据报,有边界,不存在粘包,但是可能丢包. 产生粘包问题的原因 . ...
随机推荐
- CMMI4级实践中的5个经典问题及解答
这五个问题相当经典而且比较深,需要做过CMMI4.5级的朋友才能看懂这些问题.这5个问题是一位正在实践CMMI4级的朋友提出来的,而解答则是我的个人见解. 五个疑问是: A.流程,子流程部分不明白 ...
- 解析ABP框架中的事务处理和工作单元,ABP事务处理
通用连接和事务管理方法连接和事务管理是使用数据库的应用程序最重要的概念之一.当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的. 正如大家都知道的,.Net使用连接池(connec ...
- 初识Go
意外关注到一位牛人的微信,提到了2014年他推荐的编程语言是Go.于是乎饶有兴趣的淘了一本书<Go语言程序设计>,学习起来. 第一章的练习题我的答案如下: // Copyright © 2 ...
- hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...
- C#正则表达式开源工具,为.net开源绵尽薄力
先交代一下背景,最近工作中经常用到正则表达式,而正则表达式这个东西我个人觉得很鸡肋,不用吧,有些功能实现起来会很麻烦.用吧,又不是说工作中经常用到,只是有时候有些需要求用到而已.但是正则表达式只要一段 ...
- sshpass批量执行操作
while read line do ./sshpass -p 密码 ssh root@$line “ls” done<./backup while read line ;do /usr/bin ...
- Windows Azure HDInsight 使用技巧
Windows Azure HDInsight是一个面向大数据的PaaS服务,是PaaS版本的Hadoop.HDInsight是微软与Hortonworks合作的产物.可以理解为Hortonworks ...
- [转]How to add new table in NopCommerce
本文转自:http://www.tech-coder.com/2015/07/how-to-add-new-table-in-nopcommerce.html Hey guys I am back a ...
- .Net程序员之Python基础教程学习----字符串的使用 [Second Day]
在The FirstDay 里面学习了列表的元组的使用,今天开始学习字符串的使用.字符串的使用主要要掌握,字符串的格式化(C语言中我们应该都知道,Python和C语言差别不大),字符串的基本 ...
- BFC 小结
最近对一些基础知识进行了整理,下面是针对 BFC 的一些整理以及本人对 BFC 的一些理解. 1. 首先,什么是 BFC 呢? BFC,Block formatting context,直译为&quo ...