简洁的UDP协议通讯 | PHP&&C | socket

前言 今天在公司玩了一下UDP协议通讯,因为公司对服务器的安全性要求很高,没有 http协议,要通信那就来tcpudp,好勒,那就来UDP,其实公司也没有做到高安全性,不说其他的,公司却做了傻逼一样的限制,针对开发者。

第一:几乎没有网络 第二:我的电脑安装了公司的一个xx软件,只能上内网服务器,外网?拜拜,怪我太年轻无知。 第三:傻逼式开发,直接在服务器编码。果然有毒,说好的svn、git协作与维护管理呢。哎


UDP传输原理 UDP传输不需要连接, 发送端只需要把自己的消息打包好(UDP报文), 然后从电脑上发到因特网即可, 不会有任何的确认帧来反馈给你.


等着,代码见!(加班困了,晚安)

PHP-Server

<?php
include_once "actionLoad.php";
//include_once "config/socket.php";
define("SERVER","udp://127.0.0.1:9998");

$socket = stream_socket_server(SERVER, $errno, $errstr, STREAM_SERVER_BIND);

!$socket ? die("$errstr ($errno)") : null;
echo "udp server had started...\nthe port is 9998...\n";
do {
    //接收客户端发来的信息
    $request_msg = stream_socket_recvfrom($socket, 1024 * 2, 0, $client);
    //打印客户端的传输信息
    echo $request_msg."\n";
    /*路由转发 - 业务逻辑路由器*/
    coreHandler($socket, $request_msg, $client);
} while ($request_msg !== false);

Run Server

➜  php server.php
udp server had started...
the port is 9998...

PHP-Client

/**
 * @param string $sendMsg
 * @param string $ip
 * @param string $port
 * @return bool|string
 */
function udpRequest($sendMsg = '', $ip = '127.0.0.1', $port = '9998') {
    $handle = stream_socket_client("udp://{$ip}:{$port}", $errno, $errstr);
    !$handle ? die("ERROR: {$errno} - {$errstr}\n") : null;
    fwrite($handle, $sendMsg . "\n");
    $result = fread($handle, 1024);
    fclose($handle);
    return $result;
}

$result = udpRequest(json_encode(array("code" => 4, "name" => "alicfeng")));
echo $result;

Run Client

➜  php client.php

C-Client

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

/*UDP服务器地址*/
#define LOG_SERV_ADDR "127.0.0.1"
/*udp服务器端口*/
#define LOG_SERV_PORT 9998
/*环境模式*/
#define LOG_ENV_DEV 1

/**
 * 往udp仍数据
 * @param message
 */
void send_msg_udp(char *message) {
    if(LOG_ENV_DEV!=1){
        return;
    }
    int sockfd;
    struct sockaddr_in servaddr;
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    /* 初始化udp信息 */
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(LOG_SERV_PORT);
    if (inet_pton(AF_INET, LOG_SERV_ADDR, &servaddr.sin_addr) <= 0) {
        return;
    }
    /* 连接UDP服务器 */
    if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) {
        perror("connect udp error");
        return;
    }
    /*往UDP写数据*/
    write(sockfd, message, strlen(message));
}

int main(int argc, char **argv) {
    send_msg_udp("alicFeng在扔数据...");
    return 0;
}

Run Client

gcc -o client client.c && ./client

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是东东强

TCP分段与IP分片的区别与联系

我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段(Segmentation),在接收时进行重组,同样IP数据报在长度超过一定值时...

2032
来自专栏码神联盟

【原创】浅谈网络协议

网络绝杀秘籍:OSI和TCP/IP是很基础但又非常重要的网络基础知识,理解得透彻对我们来说非常有帮助。一起来和小编复习下吧..... OSI七层模型: ...

2947
来自专栏take time, save time

三十天学不会TCP,UDP/IP网络编程 - 绅士的开始

经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://www.gitbook.com/@rog...

36110
来自专栏用户画像

第10章 广域网技术概述

61. 广域网接口多种多样,下列对于广域网接口的描述错误的是_B_。(选择一项或多项)

632
来自专栏云上大文件传输

为什么新开发的可靠传输协议都是基于UDP协议?

今天,在这里介绍一下为什么很多新的可靠传输协议(比如QUIC、KCP、Fasp、UDT)都是基于UDP协议的,它的技术原因在哪里?

7498
来自专栏Java编程

什么是框架?

张大胖立志走上Java之路, 听了大神Bill的指点, 先学了Java SE, 把集合、线程、反射、IO、泛型、注解之类的基础知识学了一遍, 在Bill的严厉督...

3427
来自专栏互联网技术杂谈

udp的若干问题

参考链接:https://blog.csdn.net/dog250/article/details/6896949

45210
来自专栏QQ会员技术团队的专栏

告知你不为人知的 UDP:疑难杂症和使用

本文承接《告知你不为人知的UDP:连接性和负载均衡》文章的下文,本文主要从UDP疑难杂症、UDP协议与TCP协议高效性的对比以及UDPd的使用场合这三个方面描述...

4.8K4
来自专栏栗霖积跬步之旅

第一章计算机网络和因特网-day01

什么是因特网: 其一:构成因特网的基本硬件与软件。 其二:为分布式应用提供服务的联网基础设施。 终端机器称为主机( host ) 或者端系统( end syst...

3235
来自专栏take time, save time

三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学

新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www...

3749

扫码关注云+社区