Linux——Socket之UDP程式設計
阿新 • • 發佈:2018-10-31
一、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;
}
四、總結
指標:這裡有一個元素,前後可能還有其他的元素
陣列:這裡有一個元素,前面沒有別的東西,只能通過其下標才訪問到後面的元素的地址;陣列的第一個元素的地址可以作為變數賦值。