1. 程式人生 > >Linux——Socket之UDP程式設計

Linux——Socket之UDP程式設計

一、linux網路通訊的BSD套接字(Berkeley Software Distribution)
包括三種方式:1、流式(可靠TCP)2、資料表(面向報文UDP)3、原始(訪問底層協議)
端式:大端(最高位元組先發現)小端(最低位元組先發現)
通訊端點(繫結IP地址,埠號)


二、基本函式
unsigned short
unsigned long
網路到主機短:ntohs(network to host short)
網路到主機長:ntohl
主機到網路短:htons
主機到網路長:htonl
這裡寫圖片描述


三、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;

}


四、總結
指標:這裡有一個元素,前後可能還有其他的元素
陣列:這裡有一個元素,前面沒有別的東西,只能通過其下標才訪問到後面的元素的地址;陣列的第一個元素的地址可以作為變數賦值。