Linux下UDP一发一收通信
实现在Linux环境下的UDP通信测试。
注释了while循环,将代码规范化。
udpserver.c代码:
/**********************************************************************
* 版权所有 (C)2016, WangSq。
*
* 文件名称:xx.c
* 文件标识:无
* 内容摘要:udpserver演示程序
* 其它说明:无
* 当前版本:V1.0
* 作 者:WangSq
* 完成日期:2016
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
/********************socket相关******************************************/
//socket参数
#define SERVER_PORT 2234 /*监听端口*/
#define MAX_MSG_SIZE 256 /*recv缓冲器大小*/
int sockfd; //套接字描述符 /*客户机的地址信息及长度信息*/
struct sockaddr_in client;
int client_len=sizeof(struct sockaddr_in); //udp服务器监听函数初始化
void udpser_init()
{
/*服务器的地址信息*/
struct sockaddr_in server; /*服务器填充sockaddr server结构*/
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr.s_addr=htonl(INADDR_ANY);
server.sin_port=htons(SERVER_PORT); /*服务器建立socket描述符*/
if(- == (sockfd=socket(AF_INET, SOCK_DGRAM,)))
{
perror("create socket failed");
exit ();
}
/*捆绑socket描述符sockfd*/
if(- == ( bind( sockfd, ( struct sockaddr * )&server, sizeof(server) )) )
{
perror("bind error");
exit ();
}
} /*接收缓冲区--------------------len =4-----------------*/
unsigned char message[MAX_MSG_SIZE];
int recv_len=;
/* IP地址的存放缓冲区*/
char addr_p[INET_ADDRSTRLEN];
char *sndbuf = "Hello! i am OK.\n";
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期 版本号 修改人 修改内容
* -------------------------------------------------------------------
* 2016xxxx V1.0 WangSq 创建
***********************************************************************/
int main(int argc, char *argv[])
{ //udp服务器监听函数初始化
udpser_init();
// while(1)
// {
/********************************接收数据并打印*************************/
recv_len=recvfrom(sockfd,message,sizeof(message),,(struct sockaddr *)&client,&client_len); //阻塞式
if(recv_len <)
{
printf("recvfrom error\n");
exit();
}
/*打印客户端地址和端口号*/
inet_ntop(AF_INET,&client.sin_addr,addr_p,sizeof(addr_p));
printf("client IP is %s, port is %d\n",addr_p,ntohs(client.sin_port));
message[recv_len]='\0';
/*显示消息长度*/
printf("server received %d:%s\n", recv_len, message); /********************************回发数据*************************/
if(sendto(sockfd,sndbuf,strlen(sndbuf),,(struct sockaddr*)&client,client_len)<)
{
printf("sendto error\n");
exit();
}
// }
return ;
}
udpclient.c代码:
/**********************************************************************
* 版权所有 (C)2016, WangSq。
*
* 文件名称:xx.c
* 文件标识:无
* 内容摘要:udpclient演示程序
* 其它说明:无
* 当前版本:V1.0
* 作 者:WangSq
* 完成日期:2016
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h> /**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期 版本号 修改人 修改内容
* -------------------------------------------------------------------
* 2016xxxx V1.0 WangSq 创建
***********************************************************************/
#define UDP_TEST_PORT 2234 #define UDP_SERVER_IP "192.168.1.10" #define MAX_LINE 80 int main(int argC, char* arg[]) { struct sockaddr_in server; int sockfd, len = ; int server_len = sizeof(struct sockaddr_in); char *sendStr ="i am a client\n"; //默认发送串 char buf[MAX_LINE];//接收缓冲区 /* setup a socket,attention: must be SOCK_DGRAM */
if ((sockfd = socket(AF_INET, SOCK_DGRAM, )) < ) { perror("socket");
exit();
} /*complete the struct: sockaddr_in*/
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(UDP_TEST_PORT);
server.sin_addr.s_addr = inet_addr(UDP_SERVER_IP); // while(1) { //printf("Please enter a string to send to server: \n"); /* get the string from standard in*/ //len = read(STDIN_FILENO, buf, sizeof(buf)); /* send the string to server*/ if(sendto(sockfd, sendStr, strlen(sendStr), , (struct sockaddr *)&server, server_len)<) //sizeof
{
printf("sendto error\n");
exit();
} memset(buf, , sizeof(buf)); /* recieve the string from server*/ len = recvfrom(sockfd, buf, sizeof(buf), , (struct sockaddr *)&server, &server_len);
if(len <)
{
printf("recvfrom error\n");
exit();
}
printf("Receive from server: %s\n", buf); // } return ; }
Makefile:
all : udpserver udpclient
udpserver: udpserver.c
gcc udpserver.c -o udpserver
udpclient: udpclient.c
gcc udpclient.c -o udpclient clean:
rm *.o udpserver udpclient .PHONY: clean
好久没有在这里写博客了,希望自己多多加油,多实践,多思考!
Linux下UDP一发一收通信的更多相关文章
- Linux下UDP简介及程序设计
一.UDP简介 UDP(User Datagram Protocol),用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务.UDP提供了无连接通信,且不对传 ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- Linux下c开发 之 线程通信
Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...
- QT下UDP套接字通信——QUdpSocket 简单使用
QT下UDP套接字通信--QUdpSocket QUdpSocket类提供一个UDP套接字. UDP(用户数据报协议)是一种轻量级.不可靠.面向数据报.无连接的协议.它可以在可靠性不重要的情况下使用. ...
- Linux下UDP发送大量请求导致Operation not permitted的问题探讨
一.问题背景目前公司准备上微服务的架构模式,在对比大量的API网关之后,最后选中了Kong作为我们的API网关,在经过大量的研究之后,啊呸,踩坑之后,终于跑起来了,简直是普天同庆,撒花祝贺. 但是在美 ...
- Linux下UDP收/发广播消息简单实现
发送广播消息 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/typ ...
- linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)【转】
转自:http://blog.chinaunix.net/uid-28458801-id-4262445.html 操作系统:ubuntu10.04 前言: 在嵌入式开发中,只要是带操作系统的 ...
- linux下udp编程
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
随机推荐
- eBay报告:德国或将成为外贸电商热门市场
[亿邦动力网讯]1月3日消息,日前,跨境电商平台eBay发布公告称,自2014年1月中旬起,卖家在eBay德国 ( eBay.de ).eBay 奥地利 ( eBay.at ) 或eBay瑞士 ( e ...
- "Hello World!"团队第四次会议
Scrum立会 博客内容是: 1.会议时间 2.会议成员 3.会议地点 4.会议内容 5.todo list 6.会议照片 7.燃尽图 一.会议时间: 2017年10月16日 11:44-12:18 ...
- CS小分队第二阶段冲刺站立会议(5月27日)
昨天成果:昨日有些小意外,导致没有按照原定计划工作.昨天为扫雷游戏增加了新的失败特效,只要玩家点到地雷,所有的地雷都会依次出现两帧的爆炸效果,并伴随声音. 今日计划:排除一些现有程序的bug.. 遇到 ...
- 浅谈Java变量的初始化顺序详解
规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器证明代码: 复制代码 代码如下: p ...
- 关于在eclipse Oxygen 2017环境下spring3.2 asm的异常
今天在oxygen 2017下构建spring3.2+mybatis项目时,发生异常,大概是说无法解析我mapper.class文件,错误发生在core.asm中<unknow:source&g ...
- erlang中检查内存泄露
最近项目内存占用过多,检查一下erlang的内存使用情况. 1. 通过etop可以很方便得出erlang内存使用的情况 spawn(fun() -> etop:start([{output, t ...
- 使用字符界面 qemu-kvm 创建虚拟机
qemu-kvm的基本用法:指定系统类型,CPU运行模式,NUMA(Non Uniform Memory Access Architecture), 软驱设备,光驱设备,硬件设备 # 查看qemu ...
- Hibernate(五)
注解高级(原文再续书接上一回) 7.继承映射 第一种:InheritanceType.JOINED 查询时会出现很多join语句. package com.rong.entity.joined; im ...
- 7. 由一道ctf学习变量覆盖漏洞
0×00 背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导 ...
- 使用.bat文件运行ant的build.xml
1.新建一个txt文件 2.复制下面命令到txt文件 echo "Start build..." call ant.bat -f "E:\build.xml" ...