Linux下udp程序怎么运行,Linux下UDP的连接程序示例(阻塞、非阻塞)
由于前面已有介绍,关于函数就不介绍了
/*server.c_非阻塞式*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 512
int sock_bind(int lisfd, int port)
{
struct sockaddr_in myaddr;
memset((char *)&myaddr, 0, sizeof(struct sockaddr_in));//清零
myaddr.sin_family = AF_INET;//IPV4
myaddr.sin_port = htons(port);//端口
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);//允许连接到所有本地地址上
if (bind(lisfd, (struct sockaddr *)&myaddr, sizeof(struct sockaddr))==-1)
{
perror("sock_bind failed!\n");
exit(1);
}
return 0;
}
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: %s \n", argv[0]);
exit(1);
}
int lisfd;
int i;
int flag;
int nbytes;
socklen_t len;
char msg[SIZE];
struct sockaddr_in cliaddr;
bzero(msg, SIZE);
len = sizeof(cliaddr);
bzero(&cliaddr, sizeof(cliaddr));
lisfd = socket(AF_INET, SOCK_DGRAM, 0);
if (lisfd == -1)
{
perror("socket failed.\n");
exit(1);
}
sock_bind(lisfd, atoi(argv[1]));
flag = fcntl(lisfd, F_GETFL, 0);
if (flag < 0)
{
perror("fcntl failed.\n");
exit(1);
}
flag |= O_NONBLOCK;
if (fcntl(lisfd, F_SETFL, flag) < 0)
{
perror("fcntl failed.\n");
exit(1);
}
while(1)
{
nbytes = recvfrom(lisfd, msg, SIZE, 0, (struct sockaddr *)&cliaddr, &len);
if (nbytes == -1 && errno != EAGAIN)
{
perror("recv failed.\n");
exit(1);
}else if (nbytes == 0 || (nbytes==-1 && errno==EAGAIN))
{
continue;
}else
{
printf("recv: %s\n", msg);
}
for (i=0; i
{
msg[i] = toupper(msg[i]);
}
nbytes = sendto(lisfd, msg, sizeof(msg), 0, (struct sockaddr *)&cliaddr, len);//udp发送要指定IP和端口
if (nbytes == -1 && errno != EAGAIN)
{
perror("recv failed.\n");
exit(1);
}
}
close(lisfd);
return 0;
}
/*server.c_阻塞式*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 512
int sock_bind(int lisfd, int port)
{
struct sockaddr_in myaddr;
memset((char *)&myaddr, 0, sizeof(struct sockaddr_in));//清零
myaddr.sin_family = AF_INET;//IPV4
myaddr.sin_port = htons(port);//端口
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);//允许连接到所有本地地址上
if (bind(lisfd, (struct sockaddr *)&myaddr, sizeof(struct sockaddr))==-1)
{
perror("sock_bind failed!\n");
exit(1);
}
return 0;
}
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: %s \n", argv[0]);
exit(1);
}
int lisfd;
int i;
socklen_t len;
char msg[SIZE];
struct sockaddr_in cliaddr;
bzero(msg, SIZE);
len = sizeof(cliaddr);
bzero(&cliaddr, sizeof(cliaddr));
lisfd = socket(AF_INET, SOCK_DGRAM, 0);
if (lisfd == -1)
{
perror("socket failed.\n");
exit(1);
}
sock_bind(lisfd, atoi(argv[1]));
while(1)
{
recvfrom(lisfd, msg, SIZE, 0, (struct sockaddr *)&cliaddr, &len);
printf("recv: %s\n", msg);
for (i=0; i
{
msg[i] = toupper(msg[i]);
}
sendto(lisfd, msg, sizeof(msg), 0, (struct sockaddr *)&cliaddr, len);//udp发送要指定IP和端口
}
close(lisfd);
return 0;
}
/*client.c*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 512
int main(int argc, char **argv)
{
struct sockaddr_in remoaddr;
struct sockaddr_in localaddr;
if (argc != 3)
{
printf("Usage: %s \n", argv[0]);
exit(1);
}
int sockfd;
char msg[SIZE];
socklen_t len;
bzero(msg, SIZE);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
len = sizeof(localaddr);
remoaddr.sin_family = AF_INET;
remoaddr.sin_port = htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &remoaddr.sin_addr)<0)
{
perror("inet_pton failed.\n");
exit(1);
}
while(fgets(msg, SIZE, stdin) != NULL)
{
sendto(sockfd, msg, SIZE, 0, (struct sockaddr *)&remoaddr, len);//udp发送要指定IP和端口
recvfrom(sockfd, msg, SIZE, 0, (struct sockaddr *)&localaddr, &len);
printf("recv: %s\n", msg);
}
close(sockfd);
return 0;
}
#makefile
CFLAGS = -Wall -g
CC = gcc
TARGET1 = server
TARGET2 = client
all:$(TARGET1) $(TARGET2)
$(TARGET1):$(TARGET1).o
$(CC) $(CFLAGS) -o $@ $^
$(TARGET2):$(TARGET2).o
$(CC) $(CFLAGS) -o $@ $^
%.o:%.c %.h
$(CC) -c $(CFLAGS) -o $@ $<
clean:
rm -f $(TARGET1) $(TARGET2) *.o
Linux下udp程序怎么运行,Linux下UDP的连接程序示例(阻塞、非阻塞)相关推荐
- 【解决方案】64位Linux系统下无法编译、运行32位C、C++程序的解决办法
[故障] 1. 从32位系统里面复制过来的32位C或C++程序无法运行,提示找不到程序文件,或找不到libstdc++.so.6库 [oct1158@oct1158-fedora 32env]$ ./ ...
- 浅谈阻塞/非阻塞、同步/异步——从linux read()系统调用出发
浅谈阻塞/非阻塞.同步/异步 –从linux IO系统调用出发 阻塞与非阻塞主要从进程/线程的角度出发: 阻塞(blocking):教科书年年考的概念--调用方(主线程)发起调用之后挂起直到被调用方法 ...
- Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )
很多人对阻塞,非阻塞,同步,异步,并发,竞态的概念不是很清晰,今天我把我理解的用一个模型来说明一下这些概念. 首先建立一个模型: 我们去银行办理业务,屌丝的做法是: 1.银行未准备好,则一直排队,直到 ...
- 详解Linux驱动技术(五) _设备阻塞/非阻塞读写
在Linux驱动程序编写过程中,设备阻塞/非阻塞读写是一种非常重要的技术.它可以实现高效的数据传输和事件处理,提高系统的性能和响应速度.在本文中,我们将深入探讨Linux驱动技术(五) _设备阻塞/非 ...
- Linux中的mate程序的进程,终端下以后台模式运行Linux程序的过程详解
这是一个简短但是非常有用的教程:它向你展示从终端运行Linux应用程序的同时,如何保证终端仍然可以操作. 在Linux中有许多方式可以打开一个终端,这主要取决于你的发行版的选择和桌面环境. Linux ...
- 安卓跑linux程序_Android 运行 Linux 可执行程序
/**************************************************************************** * Android 运行 Linux 可执行 ...
- linux程序压缩运行,linux压缩命令【应对步骤】
虽然电脑已经很普遍了,但是一些年长的人对电脑的操作不是很熟悉,比如在使用win7系统时一旦遇到linux压缩命令 时就懵了,对于linux压缩命令 处理起来相对来说较简单,按照我们的步骤处理linux ...
- 后台运行linux程序,后台运行Linux程序的方法
后台运行Linux程序,可以通过crontab设置,这种方法一般用来让一个程序定时运行,也可以通过./test &这样在程序末尾加上一个&使程序在后台运行. 编写代码,下面我将参考ht ...
- linux系统win,Windows10安装运行linux系统的方法
Windows10如何安装运行linux系统?近来不少朋友都向小编咨询了该问题.其实,操作方法并不复杂,只是用户刚刚使用新系统可能会有点陌生.接下来,系统城小编就分享Windows10安装运行linu ...
最新文章
- 分布式任务分发框架Gearman测试、性能监控、队列持久化【python 实例】
- 你能用微信小程序打开小程序了【附开发方法】
- hw叠加层开还是不开_HW叠加层是什么?
- Vue组件通信原理剖析(一)事件总线的基石 $on和$emit
- 41、OrthoMCL和mcl软件进行基因家族分析
- python画图代码的输入数据可以取出来_用Python写了个小程序:最小二乘法、读取文件、作图以及数据输出到文件...
- 使用 pqgrid 将JSON数据转换成TABLE
- 【Elasticsearch】如何在 Elasticsearch 中轻松编写脚本
- mongodb的数据怎么导入到hdfs上_如何成为一名合格的数据架构师?
- HTTP接口测试工具Postman
- CDH报错: 主机的 NTP 服务未同步至任何远程服务器
- x265将yuv转h265(七)
- android原生browser分析(一)--Application
- mysql中的默认表_MySQL中表的默认类型为( )。_学小易找答案
- 参加2022年7月PMP考试后感受
- 在think-cell数据表中,“撤消” (Ctrl+Z) 操作无效,怎么解决?
- NR: PointA,offsetToPonitA,kSSB三者关系。
- HTML5表白小程序
- python autocad显示_Python AutoCAD 系统设置的实现方法
- Linux环境下,文件的压缩/解压
热门文章
- linux安装redis教程yum,linux下yum安装redis以及使用
- list.php tid= field,织梦CMS初试-套用指定的html模板,解析内容列表【笔记】
- 并发模拟的四种方式 + 工具,超级实用!
- 皮一皮:千万别得罪一个文科生...
- 分库分表 vs NewSQL数据库
- 有了这个IDEA插件,从此不用再开Postman了
- GitHub中的奇葩项目:登顶过趋势榜的女装大佬项目
- mysql所有的编码_MySQL 批量修改数据表编码及字符集
- mysql中有哪些数值型函数_mysql数值型函数汇总
- 对c语言和程序设计基础的体会,C语言程序设计基础与应用