由于前面已有介绍,关于函数就不介绍了

/*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的连接程序示例(阻塞、非阻塞)相关推荐

  1. 【解决方案】64位Linux系统下无法编译、运行32位C、C++程序的解决办法

    [故障] 1. 从32位系统里面复制过来的32位C或C++程序无法运行,提示找不到程序文件,或找不到libstdc++.so.6库 [oct1158@oct1158-fedora 32env]$ ./ ...

  2. 浅谈阻塞/非阻塞、同步/异步——从linux read()系统调用出发

    浅谈阻塞/非阻塞.同步/异步 –从linux IO系统调用出发 阻塞与非阻塞主要从进程/线程的角度出发: 阻塞(blocking):教科书年年考的概念--调用方(主线程)发起调用之后挂起直到被调用方法 ...

  3. Linux驱动学习9(同步/异步与阻塞/非阻塞的区别 )

    很多人对阻塞,非阻塞,同步,异步,并发,竞态的概念不是很清晰,今天我把我理解的用一个模型来说明一下这些概念. 首先建立一个模型: 我们去银行办理业务,屌丝的做法是: 1.银行未准备好,则一直排队,直到 ...

  4. 详解Linux驱动技术(五) _设备阻塞/非阻塞读写

    在Linux驱动程序编写过程中,设备阻塞/非阻塞读写是一种非常重要的技术.它可以实现高效的数据传输和事件处理,提高系统的性能和响应速度.在本文中,我们将深入探讨Linux驱动技术(五) _设备阻塞/非 ...

  5. Linux中的mate程序的进程,终端下以后台模式运行Linux程序的过程详解

    这是一个简短但是非常有用的教程:它向你展示从终端运行Linux应用程序的同时,如何保证终端仍然可以操作. 在Linux中有许多方式可以打开一个终端,这主要取决于你的发行版的选择和桌面环境. Linux ...

  6. 安卓跑linux程序_Android 运行 Linux 可执行程序

    /**************************************************************************** * Android 运行 Linux 可执行 ...

  7. linux程序压缩运行,linux压缩命令【应对步骤】

    虽然电脑已经很普遍了,但是一些年长的人对电脑的操作不是很熟悉,比如在使用win7系统时一旦遇到linux压缩命令 时就懵了,对于linux压缩命令 处理起来相对来说较简单,按照我们的步骤处理linux ...

  8. 后台运行linux程序,后台运行Linux程序的方法

    后台运行Linux程序,可以通过crontab设置,这种方法一般用来让一个程序定时运行,也可以通过./test &这样在程序末尾加上一个&使程序在后台运行. 编写代码,下面我将参考ht ...

  9. linux系统win,Windows10安装运行linux系统的方法

    Windows10如何安装运行linux系统?近来不少朋友都向小编咨询了该问题.其实,操作方法并不复杂,只是用户刚刚使用新系统可能会有点陌生.接下来,系统城小编就分享Windows10安装运行linu ...

最新文章

  1. 分布式任务分发框架Gearman测试、性能监控、队列持久化【python 实例】
  2. 你能用微信小程序打开小程序了【附开发方法】
  3. hw叠加层开还是不开_HW叠加层是什么?
  4. Vue组件通信原理剖析(一)事件总线的基石 $on和$emit
  5. 41、OrthoMCL和mcl软件进行基因家族分析
  6. python画图代码的输入数据可以取出来_用Python写了个小程序:最小二乘法、读取文件、作图以及数据输出到文件...
  7. 使用 pqgrid 将JSON数据转换成TABLE
  8. 【Elasticsearch】如何在 Elasticsearch 中轻松编写脚本
  9. mongodb的数据怎么导入到hdfs上_如何成为一名合格的数据架构师?
  10. HTTP接口测试工具Postman
  11. CDH报错: 主机的 NTP 服务未同步至任何远程服务器
  12. x265将yuv转h265(七)
  13. android原生browser分析(一)--Application
  14. mysql中的默认表_MySQL中表的默认类型为( )。_学小易找答案
  15. 参加2022年7月PMP考试后感受
  16. 在think-cell数据表中,“撤消” (Ctrl+Z) 操作无效,怎么解决?
  17. NR: PointA,offsetToPonitA,kSSB三者关系。
  18. HTML5表白小程序
  19. python autocad显示_Python AutoCAD 系统设置的实现方法
  20. Linux环境下,文件的压缩/解压

热门文章

  1. linux安装redis教程yum,linux下yum安装redis以及使用
  2. list.php tid= field,织梦CMS初试-套用指定的html模板,解析内容列表【笔记】
  3. 并发模拟的四种方式 + 工具,超级实用!
  4. 皮一皮:千万别得罪一个文科生...
  5. 分库分表 vs NewSQL数据库
  6. 有了这个IDEA插件,从此不用再开Postman了
  7. GitHub中的奇葩项目:登顶过趋势榜的女装大佬项目
  8. mysql所有的编码_MySQL 批量修改数据表编码及字符集
  9. mysql中有哪些数值型函数_mysql数值型函数汇总
  10. 对c语言和程序设计基础的体会,C语言程序设计基础与应用