一、UDP C/S编程的步骤如下图所示

二、与TCP C/S通信的区别在于:
服务端没有设置监听和等待连接的过程。客户端没有连接服务端的过程。
基于UDP的通信时不可靠地,面向无连接的,发送的数据无法确切知道对方收到没有,就算对方根本不存在,也可以发送数据出去。
这样的通信通常用在对可靠性、安全性要求不高的地方,比如语音通信(没听清楚可以让对方再说一遍)。

三、server端编程

 #include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char **argv)
{
if (argc != )
{
printf("Usage: %s port\n", argv[]);
exit();
}
printf("Welcome! This is a UDP server, I can only received message from client and reply with same message\n"); struct sockaddr_in addr;   
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[]));    //协商的发送端的端口号
addr.sin_addr.s_addr = htonl(INADDR_ANY); //本机地址 int sock;
if ( (sock = socket(AF_INET, SOCK_DGRAM, )) < )
{
perror("socket");
exit();
}
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < ) //绑定socket套接字到本地的监听端口
{
perror("bind");
exit();
}
char buff[];
struct sockaddr_in clientAddr;
int n;
int len = sizeof(clientAddr);
while ()
{
n = recvfrom(sock, buff, , , (struct sockaddr*)&clientAddr, &len);//接收UDP包
if (n>)
{
buff[n] = ;
printf("%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff);
n = sendto(sock, buff, n, , (struct sockaddr *)&clientAddr, sizeof(clientAddr));//往发送方发送UDP回复包
if (n < )
{
perror("sendto");
break;
}
}
else
{
perror("recv");
break;
}
}
return ;
}

四、client端

 #include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> int main(int argc, char **argv)
{
if (argc != )
{
printf("Usage: %s ip port", argv[]);
exit();
}
printf("This is a UDP client\n");
struct sockaddr_in addr;
int sock; if ( (sock=socket(AF_INET, SOCK_DGRAM, )) <)//创建socket
{
perror("socket");
exit();
}
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[]));
addr.sin_addr.s_addr = inet_addr(argv[]);//对方的IP地址、端口号
if (addr.sin_addr.s_addr == INADDR_NONE)
{
printf("Incorrect ip address!");
close(sock);
exit();
} char buff[];
int len = sizeof(addr);
while ()
{
gets(buff);
int n;
n = sendto(sock, buff, strlen(buff), , (struct sockaddr *)&addr, sizeof(addr));//往对方地址发送UDP包
if (n < )
{
perror("sendto");
close(sock);
break;
}
n = recvfrom(sock, buff, , , (struct sockaddr *)&addr, &len);//接收来自对方IP地址的UDP包
if (n>)
{
buff[n] = ;
printf("received:");
puts(buff);
}
else if (n==)
{
printf("server closed\n");
close(sock);
break;
}
else if (n == -)
{
perror("recvfrom");
close(sock);
break;
}
} return ;
}

转自:http://www.cnblogs.com/uvsjoh/archive/2013/01/01/2841764.html

linux udp c/s的更多相关文章

  1. Linux UDP严重丢包问题的解决

    测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...

  2. udp之关于linux udp收发包缓冲区大小

    1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...

  3. [转]Linux UDP严重丢包问题的解决

    测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...

  4. Linux UDP通信例子

    UDP C/S编程的步骤如下图所示 ////server.c #include <sys/types.h> #include <sys/socket.h> #include&l ...

  5. linux UDP,TCP相关特性

    好长时间没使用网络编程忘得差不多了,写了TCP,UDP测试代码,得出以下结论:   一:UDP特性 1. UDP sendto函数不管对端是否存在(即使对端原本存在,现在已经关闭了),都义无反顾的发送 ...

  6. Linux UDP服务器编程

    UDP主要使用sendto()和recvfrom() recvfrom() 函数原型如下: #include <sys/types.h> #include <sys/socket.h ...

  7. linux udp 函数说明

    int recvfrom(int sockfd,void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen) ...

  8. linux+udp+server+client

    一.客户端 #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include ...

  9. Linux Socket - UDP链接包

    LINUX UDP SOCKET 01 UDP号绑定会报错吗? 会的,提示Address is using,本地的没有区别 UDP不需要发起链接,不知道是不是连接成功 client的IP地址和端口号不 ...

随机推荐

  1. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

  2. Open Data for Deep Learning

    Open Data for Deep Learning Here you’ll find an organized list of interesting, high-quality datasets ...

  3. Arduino入门教程--课前准备--Arduino驱动安装及1.0 IDE菜单介绍

    编译器版本:Arduino 1.0实验器件:ocrobot mango控制板(Arduino兼容)一块 Arduino控制板到手后,首先需要在电脑上把驱动装上,这样才可以进行各种实验. 第一步需要把A ...

  4. C盘压缩,电脑无法正常启动的解决方法?

    有时候,我们觉得电脑很卡,因此压缩磁盘来节约资源,前段时间,由于不小心将C盘压缩了,导致电脑无法正常启动,查了一些有关的资料,发现很多人都遇到过类似的问题,如果你不想重装系统的话,那么,现在我说一下我 ...

  5. MAC下secureCRT无法保存密码的解决方法

    在mac下新安装了secureCRT,取代系统自带的终端工具,主要是为了方便链接服务器.mac下面的secureCRT默认保存不上密码, 我们选择了保存密码后,下次登录还是提示密码错误,需要重新认证输 ...

  6. JS无限添加HTML到指定位置

    用JS把HTML添加到指定位置有两种写法,一种是用字符串,一种是用javascript中的方法 第一种: 用字符串写 <h2>利用JS无限添加一个相同部分</h2> <h ...

  7. C# 复合赋值操作符

    前面讲过如何使用算术操作符来创建新值.例如,以下语句使用操作符+来创建比变量answer大42的一个值,新值将写入控制台: Console.WriteLine(answer + 42); 前面还讲过如 ...

  8. django视图层(views)

    1.视图层概念 视图函数,其实就是一个简单的函数,它接收web请求并返回web响应(响应的可以是一个html,一个重定向,一个xml文档等等) 每个视图函数都负责返回一个HttpResponse对象. ...

  9. LeetCode997. Find the Town Judge

    题目 在一个小镇里,按从 1 到 N 标记了 N 个人.传言称,这些人中有一个是小镇上的秘密法官. 如果小镇的法官真的存在,那么: 小镇的法官不相信任何人. 每个人(除了小镇法官外)都信任小镇的法官. ...

  10. 利用bootstrap制作滚动监听

    滚动监听(Scrollspy)插件,即自动更新导航插件,会根据滚动条的位置自动更新对应的导航目标. 在这里,需要引入三个文件:bootstrap.min.css      jquery-3.3.1.j ...