第8章 基本UDP套接字编程
时间:2022-05-03
本文章向大家介绍第8章 基本UDP套接字编程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
客户端:
#include "../Gnet.h"
void do_client(int udpfd, struct sockaddr* pserver_addr, socklen_t server_addr_len)
{
char buf[MAX_LINE];
int nread;
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
sendto(udpfd, buf, strlen(buf), 0, pserver_addr, server_addr_len);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, NULL, NULL);
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_in server_addr;
if(argc < 2)
perr_exit("usage : client <IPaddress>");
udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
do_client(udpfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
return 0;
}
#include "../Gnet.h"
void do_client(int udpfd, struct sockaddr* pserver_addr, socklen_t server_addr_len)
{
char buf[MAX_LINE];
char reply_ip[INET_ADDRSTRLEN];
int nread;
struct sockaddr_in reply_addr;
socklen_t reply_addr_len;
reply_addr_len = server_addr_len;
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
sendto(udpfd, buf, strlen(buf), 0, pserver_addr, server_addr_len);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, (struct sockaddr*)&reply_addr, &reply_addr_len);
if(reply_addr_len != server_addr_len ||
memcmp(&reply_addr, pserver_addr, reply_addr_len) != 0)
{
inet_ntop(AF_INET, &reply_addr, reply_ip, INET_ADDRSTRLEN);
printf("reply from %s (ignored)n", reply_ip);
continue;
}
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_in server_addr;
if(argc < 2)
perr_exit("usage : client <IPaddress>");
udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
do_client(udpfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
return 0;
}
#include "../Gnet.h"
void do_client(int udpfd, struct sockaddr* pserver_addr, socklen_t server_addr_len)
{
char buf[MAX_LINE];
int nread;
Connect(udpfd, pserver_addr, server_addr_len);
while(fgets(buf, MAX_LINE, stdin) != NULL)
{
Write(udpfd, buf, strlen(buf));
nread = Read(udpfd, buf, MAX_LINE);
fputs(buf, stdout);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_in server_addr;
if(argc < 2)
perr_exit("usage : client <IPaddress>");
udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
do_client(udpfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
return 0;
}
服务器:
#include "../Gnet.h"
void do_server(int udpfd)
{
ssize_t nread;
char buf[MAX_LINE];
struct sockaddr_in client_addr;
socklen_t client_addr_len;
while(1)
{
client_addr_len = sizeof(client_addr);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
sendto(udpfd, buf, nread, 0, (struct sockaddr*)&client_addr, client_addr_len);
}
}
int main(int argc, const char* argv[])
{
int udpfd;
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
Bind(udpfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
printf("waiting for connecting.n");
do_server(udpfd);
return 0;
}
服务器(select模型+tcp+udp):
#include "../Gnet.h"
void do_server(int connfd)
{
ssize_t nread;
char buf[MAX_LINE];
while((nread = Read(connfd, buf, MAX_LINE)) > 0)
Write(connfd, buf, nread);
}
void sig_child(int signo)
{
pid_t pid;
int stat;
printf("in sig_child.n");
while((pid = waitpid(-1,&stat, WNOHANG)) > 0)
printf("child %d terminatedn", pid);
printf("out sig_child.n");
}
int main(int argc, const char* argv[])
{
int lfd, connfd;
int udpfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
pid_t child_id;
const int on = 1;
fd_set rset;
int maxfd;
int nready;
int nread;
char buf[MAX_LINE];
struct sigaction sigaction_set, sigaction_get;
sigaction_set.sa_handler = sig_child;
sigemptyset(&sigaction_set.sa_mask);
sigaction_set.sa_flags = 0;
if(sigaction(SIGCHLD, &sigaction_set, &sigaction_get) <0)
printf("sigaction(SIGCHLD) error!n");
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
lfd = Socket(AF_INET, SOCK_STREAM, 0);
setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));//端口复用
Bind(lfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));
Listen(lfd, LISTENQ);
udpfd = Socket(AF_INET, SOCK_DGRAM, 0);
Bind(udpfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
printf("waiting for connecting.n");
maxfd = lfd > udpfd ? lfd : udpfd;
FD_ZERO(&rset);
while(1)
{
FD_SET(lfd, &rset);
FD_SET(udpfd, &rset);
if((nready = select(maxfd+1, &rset, NULL, NULL, NULL)) < 0)
{
if(errno == EINTR)
continue;
else
perr_exit("select error");
}
if(FD_ISSET(lfd, &rset))
{
client_addr_len = sizeof(client_addr);
connfd = Accept(lfd, (struct sockaddr*)&client_addr, &client_addr_len);
if((child_id = fork()) == 0)//子进程
{
Close(lfd);
do_server(connfd);
Close(connfd);
exit(0);
}
else//父进程
{
printf("child %d connectedn", child_id);
Close(connfd);
}
}
if(FD_ISSET(udpfd, &rset))
{
client_addr_len = sizeof(client_addr);
nread = recvfrom(udpfd, buf, MAX_LINE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
sendto(udpfd, buf, nread, 0, (struct sockaddr*)&client_addr, client_addr_len);
}
}
return 0;
}
connect:绑定对端地址
bind:绑定本端地址 github:https://github.com/gongluck/CodeBase/tree/master/notes/unpv13-notes
- 老生常谈:利用Membership实现SSO(单点登录)
- nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
- Mysql高效插入/更新数据
- 宋小菜融资2.3亿元!域名保护意识强
- 世界最奇葩的7款机器人
- Mysql高效插入/更新数据
- 关于Membership/Role您可能不知道的细节
- Sqlite向MySql导入数据
- 未来3年,人工智能如何影响法律行业?5位权威专家给出趋势
- Java 常见内存溢出异常与代码实现
- nginx限制上传大小和超时时间设置说明/php限制上传大小
- Unity Application Block 1.2 学习笔记
- 苹果首个自动驾驶专利到底有什么来头?
- 围棋遇上互联网:科技打开优秀传统文化未来之门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux部署DNS服务器
- 【C++简明教程】C++简介与环境配置
- PDF 的各种操作,我用 Python 来实现(附网站和操作指导)
- Python中map()函数用法
- 谈谈不同思路下造就的不同产品与公司形态
- OpenCV 处理中文路径、绘制中文文字的烦恼,这里通通帮你解决!
- 如何快速分析大型系统架构?
- Linux小技巧、文件查找、修改、读取
- 我在赏金计划中发现的RACE条件漏洞
- 哦!数组还能这么用,学到了!
- 【C++简明教程】随机数生成
- Pytest标记预期失败得测试用例@pytest.mark.xfail()
- IAT HOOK
- 形式化分析工具(六):HLPSL Tutorial
- 推荐一款技术人必备的接口测试神器:Apifox