linux_c_udp_example
udp_server
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h> #define BUF_SIZE 30 void err_handler(char *msg); int main(int argc, char **argv) { int srv_sock;
char msg[BUF_SIZE];
int str_len;
socklen_t cli_adr_sz; struct sockaddr_in srv_addr, cli_addr;
if (argc != ) {
printf("Usage : %s <port>\n", argv[]);
exit();
}
srv_sock = socket(PF_INET, SOCK_DGRAM, );
if (srv_sock == -) {
err_handler("UDP socket() error");
}
memset(&srv_addr, , sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
srv_addr.sin_port = htons(atoi(argv[])); if (bind(srv_sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -) {
err_handler("bind() error");
} while () {
cli_adr_sz = sizeof(cli_addr);
str_len = recvfrom(srv_sock, msg, BUF_SIZE, , (struct sockaddr *) &cli_addr, &cli_adr_sz);
sendto(srv_sock, msg, str_len, , (struct sockaddr *) &cli_addr, cli_adr_sz);
printf("recv and send ...\n");
} close(srv_sock);
return ;
} void err_handler(char *msg) {
fputs(msg, stderr);
fputc('\n', stderr);
exit();
}
udp_client
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h> #define BUF_SIZE 30 void err_handler(char *msg); int main(int argc, char **argv) { int sock;
char msg[BUF_SIZE];
int str_len;
socklen_t adr_sz; struct sockaddr_in srv_addr, from_addr;
if (argc != ) {
printf("Usage : %s <IP> <PORT>\n", argv[]);
exit();
} sock = socket(PF_INET, SOCK_DGRAM, );
if (sock == -) {
err_handler("socket() error");
} memset(&srv_addr, , sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
srv_addr.sin_addr.s_addr = inet_addr(argv[]);
srv_addr.sin_port = htons(atoi(argv[])); while () {
fputs("Input msg(Q to quit):", stdout);
fgets(msg, BUF_SIZE, stdin);
if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) {
break;
}
sendto(sock, msg, strlen(msg), , (struct sockaddr *) &srv_addr, sizeof(srv_addr));
adr_sz = sizeof(from_addr);
str_len = recvfrom(sock, msg, BUF_SIZE, , (struct sockaddr *) &srv_addr, &adr_sz);
msg[str_len] = ;
printf("Msg form srv : %s", msg);
}
close(sock);
return ;
} void err_handler(char *msg) {
fputs(msg, stderr);
fputc('\n', stderr);
exit();
}
build
gcc -o usrv udp_srv.c -g -Wall
gcc -o ucli udp_cli.c -g -Wall
linux_c_udp_example的更多相关文章
随机推荐
- IDEA激活方法(Linux和Windows通用)
一.前言 idea是一款十分智能的编程软件,有能力的同志们还是尽量支持正版. 二.激活流程 话不多说,开始教程 2.1 下载激活工具包 链接:https://pan.baidu.com/s/1nj3w ...
- L1-046. 整除光棍(模拟除法)
题意: 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在, ...
- python matplotlib绘图/sklearn包--make_blobs()
1.make_bolbs() 函数 from sklearn.datasets.samples_generator import make_blobs import numpy as np impor ...
- 微信公众号sdk
微信公众号开发 能享用微信公众号的API,比如分享给好友,分享到朋友圈,禁止菜单功能,选择图片,获取地址,以及支付 微信的功能有两种执行方式 一种是 wx.xx 一种是 WeixinJSBridge. ...
- 使用Spring Data JPA的Spring Boot
本文教你开始使用Spring Data JPA.来自优锐课JAVA架构专业讲师精心整理. 欢迎使用带有Spring Data JPA的Spring Boot教程!在本教程中,我们将看到Spring D ...
- 7.8 Varnish 其他命令
- Java线程池 ThreadPoolExecutor类
什么是线程池? java线程池是将大量的线程集中管理的类, 包括对线程的创建, 资源的管理, 线程生命周期的管理. 当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程, 从而减少系 ...
- MQTT 协议学习:008-在STM32上移植MQTT
前言 通过前面了解MQTT有关概念.分析了有关的报文,我们对于这个协议也有了更深的认识.但纸上谈来终觉浅,绝知此事要躬行. 本文参考:<STM32+W5500+MQTT+Android实现远程数 ...
- 循环指令 LOOP
循环程序: 如果需要重复执行若干次同样任务.用循环执行 循环指令: LOOP <跳转标号> 用累加器的低字做循环计数器 每次执行LOOP 指令的时候,累加器的低字减去1 若减去后 非零 , ...
- Spring入门之三-------SpringIoC之Scopes
一.singleton和prototype public class Bean1 { public Bean1() { System.out.println(this.getClass().getSi ...