一、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

最新文章

  1. spring+mybatis+oracle/mysql整合开发需要的jar包详解
  2. 理解jquery的$.extend()、$.fn和$.fn.extend()
  3. web聊天室
  4. SharePoint 2013 REST 服务使用简介
  5. (medium)LeetCode 229.Majority Element II
  6. C++开源跨平台类库集
  7. leetcode@ [116/117] Populating Next Right Pointers in Each Node I &amp; II (Tree, BFS)
  8. jQuery实现Twitter的自动文字补齐特效
  9. Selenium WebDriver ie,chrome 驱动
  10. 年末整理git和svn的使用心得
  11. 一张图讲解对象锁和关键字synchronized修饰方法
  12. css befroe after 尾类技术器
  13. 面向对象OOP概念描述
  14. 如何成为F1车手?
  15. endnote中文格式“,等”的修改
  16. UVa 11134 - Fabled Rooks 优先队列,贪心 难度: 0
  17. 保持url唯一性 解决多个网站首页问题
  18. (转)python-user-agents
  19. NTC电阻抑制冷机启动浪涌电流
  20. Android学习之Gallery

热门文章

  1. windows 2008 R2-Zabbix server 3.0监控主机的加入
  2. SIEMENS Simotion 运动控制器设置Web service, HTTP, FTP访问密码
  3. Nagios监控ActiveMQ插件开发和部署注意事项
  4. IOS http协议 总结
  5. 类似LIS+贪心(ZOJ1025)
  6. 从Internet下载一个文件
  7. Maven项目导出可执行jar
  8. JAVA通用BaseServlet的产生和代码实现
  9. Python 创建项目、应用
  10. Java删除文件或目录及目录下所有文件