- 浏览: 266335 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
AndMacLinuXp:
试了下,不错!
printk内核调试 -
klose:
我引用你的文章,并做了简单的分析:这里贴出url:http:/ ...
linux系统调用fork, vfork, clone -
klose:
你上面提到的问题:free的问题。首先你可能疏忽了,stack ...
linux系统调用fork, vfork, clone -
qwe_rt:
HI ,非常nice的文章,在阅读过程中,我发现我的ubunt ...
linux手动添加开机启动的服务 -
suifeng:
谢谢分享, 受用中.
shell编程分支,循环
虽然UDP不保证传输的可靠性,但UDP无链接性相对于TCP仍然有其它方面的优势。比如之前的聊天程序,基于TCP实现的聊天程序在群聊方面就很麻烦,因为链接总是双方的通信,很难加入第3方(或许应该说更本就不能加入)。其次UDP没有建立链接过程速度相对来说更快一点(至少它没有三路握手,发送数据也不需要对方确认收到)。
UDP编程过程:
服务器端:
1.创建socket
2.绑定端口
3.调用recvfrom获取数据
4.处理请求
5.调用sendto发送数据
客户端:
1.创建socket
2.sendto发送数据
3.recvfrom接受数据
4.close
没有建立链接的过程,只管接受发送数据(数据丢失,UDP不提供重发,也不会报错,当然不会报错也不是绝对的。比如发送包太大超过了UDP承载限度,则会返回错误。但可惜就是这点报错,不同的地方也不一定都是支持的)。所以相对来说UDP发送小批量数据更为有效,也更为方便。
下面介绍下几个之前UDP重要的函数。
int socket(AF_INET, SOCK_DGRAM,0)这个之前曾经说过,前2个参数不同的组合则代表不同的协议。
#include "sys/types.h"
#include "sys/socket.h"
ssize_t sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * to, socklen_t to_len);
返回值 如果成功则返回发送字节数,返回-1出错。
参数buf是要发送的内容,len发送的长度,flags在这里总是为0, to要发送的目的套接口描述结构,to_len指的是to的长度。
ssize_t recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * from, socklen_t * fromlen)
很好理解,稍微不同的地方是from指的是发送者的套接口描述结构。如果你要处理完后,有消息向该套接口发送则建议取出,如果只是取数据,并不对来源发送任何响应,则直接放NULL即可。
(注:这个2个函数也可以用于TCP中,用于替代read和write,但一般没有这个必要)。
例子就给之前聊天程序用UDP改写下:
[root@liumengli net]# cat chat_udp_server.c
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include "sys/wait.h"
#include "sys/select.h"
#include "sys/poll.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
int sockfd;
struct sockaddr_in serv_socket;
struct sockaddr_in * client_socket = NULL;
char send[MAXSIZE + 1];
char recv[MAXSIZE + 1];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serv_socket, sizeof(serv_socket));
serv_socket.sin_family = AF_INET;
serv_socket.sin_addr.s_addr = htonl(INADDR_ANY);
serv_socket.sin_port = htons(atoi(argv[1]));
bind(sockfd, (struct sockaddr *)&serv_socket, sizeof(serv_socket));
socklen_t len = sizeof(client_socket);
for(;;) {
fd_set rest;
FD_ZERO(&rest);
FD_SET(0, &rest);
FD_SET(sockfd, &rest);
int flag = select(sockfd + 1,&rest, NULL, NULL, NULL);
if(flag <= 0)
continue;
if(FD_ISSET(0, &rest) && client_socket) {
int n = read(0, send, MAXSIZE);
int flag = sendto(sockfd, send, n, 0, (struct sockaddr *)client_socket, sizeof(struct sockaddr_in));
if(flag == -1)
printf("system message:send failed!\n");
}
if(FD_ISSET(sockfd, &rest)) {
client_socket = (struct sockaddr_in *) malloc (sizeof(struct sockaddr_in));
socklen_t len = sizeof(struct sockaddr_in);//这步一定要有,一定要使len长度确定,不然就会发现无法正确的到客户端信息,如果不需要返回数据给客户端,则无所谓,当然聊天是双方,得不到客户端信息,则没法“聊”下去
int n = recvfrom(sockfd, recv, MAXSIZE, 0, (struct sockaddr *)client_socket, &len);
recv[n] = '\0';
printf("client message:%s", recv);
}
}
}
[root@liumengli net]# cat chat_udp_client.c
#include "/programe/net/head.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/select.h"
#define MAXSIZE 100
int main(int argc, char ** argv) {
int sockfd;
struct sockaddr_in serv_socket;
int maxfdpl;
char send[MAXSIZE];
char recv[MAXSIZE];
if(argc != 2) {
printf("please input port");
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
bzero(&serv_socket, sizeof(serv_socket));
serv_socket.sin_family = AF_INET;
serv_socket.sin_port = htons(atoi(argv[1]));
inet_pton(AF_INET, "192.168.1.235", &serv_socket.sin_addr);
for(;;) {
fd_set rest;
FD_ZERO(&rest);
FD_SET(0, &rest);
FD_SET(sockfd, &rest);
int flag = select(sockfd + 1, &rest, NULL, NULL, NULL);
if(flag <= 0)
continue;
if(FD_ISSET(0, &rest)) {
int n = read(0, send, MAXSIZE);
int temp = sendto(sockfd, send, n, 0, (struct sockaddr *)&serv_socket, sizeof(struct sockaddr_in));
if(temp == -1)
printf("system message:send failed\n");
}
if(FD_ISSET(sockfd, &rest)) {
int n = recvfrom(sockfd, recv, MAXSIZE, 0, (struct sockaddr *)NULL, NULL);
recv[n] = '\0';
printf("server message:%s", recv);
}
}
}
相对于TCP,UDP的要简单很多。因为UDP没有链接,所有链接带来了很多麻烦在这里就不复存在,首先不用为释放链接烦恼。其次,服务器设计方面要简单,TCP是以链接为基础的传输服务,因此TCP服务器都是并发多进程为每一个链接创立一个线程然后为每一个客户服务。而UDP没有链接,UDP服务器常常采用迭代式设计不需要多进程。(当然,如果你设计成多进程为每一个客户服务,也似可以的,而且会提高效率,当然给自己写代码也带来麻烦)。
其次,有点注意,UDP不提供确认。如果在聊天过程中,我们把服务器关了。客户端不关,你仍然会发现客户端不会报任何错误(UDP不提供确认)。如果想提供保证,则需要自己实现。
TCP在调用read去读套接口数据时候,如果读到0,一般则意味着对方发送fin包,需要关闭链接。UDP如果调用recvfrom读到0,没有关闭链接一说,所以也不存在所谓的FIN,UDP接受到0则表示数据端内确实没有数据。
发表评论
-
hdfs集群搭建
2014-05-11 17:19 998网上很多hadoop集群搭建的文章,我这里只写下hdfs,不 ... -
网站性能优化
2013-10-25 10:43 0好久没写了,最近一直在做些互联网的一些东西。下面介绍些性能优 ... -
html5学习网站
2011-07-29 14:55 902htm5:http://www.w3school.com.cn ... -
HTTP下载
2011-02-09 15:24 1082HTTP下载的关键是修改Content-Type。 C ... -
28.sniffer程序2
2010-07-01 17:51 1768对前面27中sniffer中的一 ... -
27. sniffer程序
2010-06-30 11:51 5909网络抓包,必需从数据链路层开始抓取,至于原因之前在原始套接口中 ... -
java 和 linux c udp通信的样例
2010-05-28 11:58 2463一个简单的例子 java段(客户端) package ... -
26.原始套接字
2010-05-12 16:45 1759一个小程序: //发送方 #include <sys ... -
25.cookies和session
2010-05-10 15:21 893原文出自:http://blog.csdn ... -
24.SOCKET模拟HTTP请求
2010-05-07 14:11 5318HTTP请求头部样例: GET http://www.bai ... -
23.广播
2010-04-29 16:34 940如果想发送广播到目前为止只能使用AF_INET, SOCK_D ... -
22.非阻塞connect
2010-04-28 11:36 2715connect非阻塞套接口时候,一般使用在以下几种情况: ... -
21.非阻塞I/O
2010-04-27 16:54 2071设置一个I/O成为非阻塞很简单,只需要: int val = ... -
20.辅助数据 和 传输描述字
2010-04-26 15:53 2063打开一个文件或者一个 ... -
19.unix域协议与TCP UDP不同之处
2010-04-22 13:46 2613之前说过一些区别,但基本对我们编程来说没有太多影响,但以下几个 ... -
18.unix域协议
2010-04-21 16:47 2621UNIX域协议并不是一个真正的协议族,它是用在同一台主机上进行 ... -
17.I/O函数recvmsg与sendmsg
2010-04-20 15:58 12421想对于之前的几个IO函 ... -
16.I/O函数
2010-04-20 13:51 1240最早使用的read与write函 ... -
15.服务器守护进程
2010-04-16 17:44 1394前面提到过的服务器都占有控制终端。而有些进程并不需要控制终端。 ... -
14.udp与connect
2010-04-13 16:41 3210UDP在调用sendto发送数据 ...
相关推荐
C#, 网络编程基础知识.UDP编程,开发手册jquery css 学习实例 公司网站内部源代码
TCP.UDP高级编程,是一个高级的聊天程序,程序中集成了TCP和UDP聊天程序,注意程序运行的时候需要设定命令行参数,可以在项目设置中进行设定,或者通过命令行参数直接执行
TCP.UDP高级编程,一个简单的聊天程序。
TCP UDP 高级编程分为客户端和服务端,功能较为齐全,在VC++ 6.0下运行成功
socket编程
JAVA进行UDP编程 JAVA进行UDP编程 JAVA进行UDP编程
Visual C++网络通信协议分析之TCP.UDP高级编程.
完整的TCP和UDP通信程序,可以方便的实现socket通信
TCP.UDP高级编程,是一个高级的聊天程序,程序中集成了TCP和UDP聊天程序 TCP聊天是程序服务器端程序 CP聊天客户端是TCP聊天程序客户端程序 UDP点对点聊天是一个UDP的点对点聊天程序
vc++开发、代码完整、详细;可编译、可执行
TCP UDP高级编程:一个VC++服务端程序,提供初学者使用
网络编程2UDP编程 网络编程2UDP编程 网络编程2UDP编程
J2ME开发教程,完整的介绍J2ME的开发体系和基本开发
J2ME开发教程,完整的介绍J2ME的开发体系和基本开发
非常简单但非常实用得UDP网络编程程序,有需要进行UDP编程的基本上可以拿来套用了
linux UDP编程总结和实例
Java的UDP编程
Linux 下 UDP 网络编程的基本服务器模型步骤、循环服务器模型步骤和并发服务器模型步骤,包括代码和步骤注释