Linux——Socket之UDP编程

- 日理万妓 2022-06-02 09:55 332阅读 0赞

一、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:

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. int main (int argc , char** argv)
  4. {
  5. int snmpfd;
  6. snmpfd = socket(AF_INET,sock_DGRAM,0);
  7. }

然后进行绑定操作

  1. int snmpfd;
  2. struct sockaddr_in servaddr;
  3. struct sockaddr from;
  4. int retStatus;//记录返回的状态,如果连接失败则退出
  5. snmpfd = socket(AF_INET,sock_DGRAM,0);
  6. bzero(&servaddr,sizeof(servaddr));//把结构的每一个成员都清零,做了初始化
  7. servaddr.sin_family = AF_INET;//对每一项进行赋值
  8. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//远程的接收IP包的地址
  9. servaddr.sin_port = htons(161);//固定端口
  10. retStatus = bind(snmpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));//绑定
  11. if(retStatus <0)//绑定失败
  12. {
  13. printf("Unable to bind to socket(%d).\n",errno );//打印出错误的值是多少
  14. exit(-1);
  15. }

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

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. struct messageStruct{
  4. unsigned char buffer[1025];//请求
  5. int len ;
  6. int index;
  7. };//动态,一个请求包对应一个相应,(动态存储使用时间短会及时释放)
  8. static struct messageStruct request,response;//静态buffer
  9. int main (int argc , char** argv)
  10. {
  11. int snmpfd;
  12. struct sockaddr_in servaddr;
  13. struct sockaddr from;
  14. int fromlen;//长度
  15. int retStatus;//记录返回的状态,如果连接失败则退出
  16. snmpfd = socket(AF_INET,sock_DGRAM,0);
  17. bzero(&servaddr,sizeof(servaddr));//把结构的每一个成员都清零,做了初始化
  18. servaddr.sin_family = AF_INET;//对每一项进行赋值
  19. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//远程的接收IP包的地址
  20. servaddr.sin_port = htons(161);//固定端口
  21. retStatus = bind(snmpfd,(struct sockaddr*)&servaddr,sizeof(servaddr));//绑定
  22. if(retStatus <0)//绑定失败
  23. {
  24. printf("Unable to bind to socket(%d).\n",errno );//打印出错误的值是多少
  25. exit(-1);
  26. }
  27. for(;;)
  28. {
  29. fromlen = sizeof(from);//sizeof(struct sockaddr);也可以
  30. recvfrom(snmpfd,&request.buffer[0],1024,0,&from,&fromlen);//成功之后则接收.1024长度,0标志
  31. }
  32. close(snmpfd);//结束
  33. return 0;
  34. }

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

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UDP编程

    UDP编程依靠的协议是UDP协议,这种编程方式是不可靠的信息传输方式,比如通话这类,是允许信息丢失的。UDP采用报文的方式收发信息而不采用流的方式,每次发送的报文大小也是有限制

    相关 Qt网络编程UDP通信

    UDP(User Datagram Protocol,用户数据报协议)是一个轻量级的、不可靠的、面向数据报的、无连接的协议,用于可靠性不是非常重要的情况下,例如,一个服务器报告

    相关 UDP编程

    UDP编程 本文内容来源于《TCP/IP网络编程第六章》。主要需要了解UDP常用两个函数:sendto()和recvfrom(),其中两个函数调用次数要相同,如下面例子所