欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux——Socket之UDP编程

程序员文章站 2022-03-16 11:05:03
...

一、linux网络通讯的BSD套接字(Berkeley Software Distribution)
包括三种方式:1、流式(可靠TCP)2、数据表(面向报文UDP)3、原始(访问底层协议)
端式:大端(最高字节先发现)小端(最低字节先发现)
通讯端点(绑定IP地址,端口号)


二、基本函数
unsigned short
unsigned long
网络到主机短:ntohs(network to host short)
网络到主机长:ntohl
主机到网络短:htons
主机到网络长:htonl
Linux——Socket之UDP编程


三、SNMP服务器配置
创建socket->填写IP地址和端口->成功->接收数据
小tips:可以使用man socket来查看socket函数的使用方法
先创建socket:

#include <sys/types.h>
#include <sys/socket.h>

int main (int argc , char** argv)
{
    int snmpfd;
    snmpfd = socket(AF_INET,sock_DGRAM,0);
}

然后进行绑定操作

int snmpfd;
    struct sockaddr_in servaddr;
    struct sockaddr from;
    int retStatus;//记录返回的状态,如果连接失败则退出

    snmpfd = socket(AF_INET,sock_DGRAM,0);
    bzero(&servaddr,sizeof(servaddr));//把结构的每一个成员都清零,做了初始化
    servaddr.sin_family = AF_INET;//对每一项进行赋值
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//远程的接收IP包的地址
    servaddr.sin_port = htons(161);//固定端口

    retStatus = bind(snmpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));//绑定
    if(retStatus <0)//绑定失败
    {
        printf("Unable to bind to socket(%d).\n",errno );//打印出错误的值是多少
        exit(-1);
    }

再接收buffer(很重要),完整代码如下:

#include <sys/types.h>
#include <sys/socket.h>

struct messageStruct{
    unsigned char buffer[1025];//请求
    int len ; 
    int index;
};//动态,一个请求包对应一个相应,(动态存储使用时间短会及时释放)

static struct messageStruct request,response;//静态buffer

int main (int argc , char** argv)
{
    int snmpfd;
    struct sockaddr_in servaddr;
    struct sockaddr from;
    int fromlen;//长度
    int retStatus;//记录返回的状态,如果连接失败则退出

    snmpfd = socket(AF_INET,sock_DGRAM,0);
    bzero(&servaddr,sizeof(servaddr));//把结构的每一个成员都清零,做了初始化
    servaddr.sin_family = AF_INET;//对每一项进行赋值
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//远程的接收IP包的地址
    servaddr.sin_port = htons(161);//固定端口

    retStatus = bind(snmpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));//绑定
    if(retStatus <0)//绑定失败
    {
        printf("Unable to bind to socket(%d).\n",errno );//打印出错误的值是多少
        exit(-1);
    }
    for(;;)
    {
    fromlen = sizeof(from);//sizeof(struct sockaddr);也可以
    recvfrom(snmpfd,&request.buffer[0],1024,0,&from,&fromlen);//成功之后则接收.1024长度,0标志
    }

    close(snmpfd);//结束

    return 0;

}


四、总结
指针:这里有一个元素,前后可能还有其他的元素
数组:这里有一个元素,前面没有别的东西,只能通过其下标才访问到后面的元素的地址;数组的第一个元素的地址可以作为变量赋值。

相关标签: udp