linux udp c/s
一、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的更多相关文章
- Linux UDP严重丢包问题的解决
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...
- udp之关于linux udp收发包缓冲区大小
1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...
- [转]Linux UDP严重丢包问题的解决
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...
- Linux UDP通信例子
UDP C/S编程的步骤如下图所示 ////server.c #include <sys/types.h> #include <sys/socket.h> #include&l ...
- linux UDP,TCP相关特性
好长时间没使用网络编程忘得差不多了,写了TCP,UDP测试代码,得出以下结论: 一:UDP特性 1. UDP sendto函数不管对端是否存在(即使对端原本存在,现在已经关闭了),都义无反顾的发送 ...
- Linux UDP服务器编程
UDP主要使用sendto()和recvfrom() recvfrom() 函数原型如下: #include <sys/types.h> #include <sys/socket.h ...
- linux udp 函数说明
int recvfrom(int sockfd,void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen) ...
- linux+udp+server+client
一.客户端 #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include ...
- Linux Socket - UDP链接包
LINUX UDP SOCKET 01 UDP号绑定会报错吗? 会的,提示Address is using,本地的没有区别 UDP不需要发起链接,不知道是不是连接成功 client的IP地址和端口号不 ...
随机推荐
- Python输入与循环
python while循环 while 语句: 执行语句 结束条件 #应用while输出1到11 counts = 1 while True: print("counts:", ...
- python读入文档中的一行
从文件log_fusion中读入数据 方法1 f = open("log_fusion.txt") # 返回一个文件对象 line = f.readline() # 调用文件的 r ...
- 初学React:定义一个组件
接着聊React,今天说说如何创建一个组件类. <!DOCTYPE html> <html lang="en"> <head> <meta ...
- while循环小例
# 使用while 循环输入 1 2 3 4 5 6 8 9 10 n = 1 while n <= 10: if n == 7: pass else: print(n) n = n + 1 # ...
- Poj (3239),m皇后问题
题目链接:http://poj.org/problem?id=3239 构造法很牛逼啊,把这个搜索的题直接变成了打表. 我用dfs写了一下. 构造法公式(序列):一.当n mod 6 != 2 或 n ...
- Linux 初学者:移动文件
你学习了有关目录和访问目录的权限是如何工作的.你在这些文章中学习的大多数内容都可应用于文件 -- Paul Brown 在之前的该系列的部分中, 你学习了有关目录 和 访问目录 的权限 是如何工作的. ...
- c# 语法 字符串内插
结果截屏 参考文章 https://www.cnblogs.com/csproj/p/Interpolated_Strings.html c# 6.0语法 https://www.cnblogs.co ...
- JAVA HTTP连接(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)
public static void main(String[] args) { // TODO Auto-generated method stub try { URL url = new URL( ...
- C#静态成员和非静态成员
一.C#静态成员和非静态成员 1. C#静态成员和非静态成员 当类中的某个成员使用static修饰符时,就会被声明为静态成员.类中的成员要么是静态成员,要么是非静态成员.一般情况下,静态成员属于整个类 ...
- 前端JavaScript之ECMA
1.JavaScript基础 2.语法规则 3 常用内置对象 4 函数 5 伪数组 6.异常处理 1.1 web前端分为三层 HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化 ...