📄 udp_socket.c
字号:
#include <sys/socket.h>#include <linux/types.h>#include <linux/errqueue.h>#include <sys/ioctl.h>#include "my_inet.h"#include <stdio.h>#include <errno.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>int ip_control_msg( struct cmsghdr *msg ){ int ret = 0; switch( msg->cmsg_type ){ case IP_RECVERR: { struct sock_extended_err *exterr; exterr = (struct sock_extended_err *)(CMSG_DATA(msg)); printf("ee_errno: %u\n", exterr->ee_errno ); printf("ee_origin: %u\n", exterr->ee_origin ); printf("ee_type: %u\n", exterr->ee_type ); printf("ee_code: %u\n", exterr->ee_code ); printf("ee_pad: %u\n", exterr->ee_pad ); printf("ee_info: %u\n", exterr->ee_info ); printf("ee_data: %u\n", exterr->ee_data ); } ret = -1; break; default: break; } return ret; }int control_msg( struct msghdr *msg ){ int ret = 0; struct cmsghdr *control_msg = CMSG_FIRSTHDR( msg ); while( control_msg != NULL ){ switch( control_msg->cmsg_level ){ case SOL_IP: ret = ip_control_msg( control_msg ); break; default: break; } control_msg = CMSG_NXTHDR( msg, control_msg ); } return ret;}int main(){ int i; struct sockaddr_in dest; dest.sin_family = MY_PF_INET; dest.sin_port = htons(16000); dest.sin_addr.s_addr = 0x013010AC; int fd = socket( MY_PF_INET, SOCK_DGRAM, MY_IPPROTO_UDP ); if( fd < 0 ){ perror("socket: "); return -1; } if( connect( fd, (struct sockaddr*)&dest, sizeof(dest) ) < 0 ){ perror("connect: "); return -1; } int val = 1; if( setsockopt( fd, SOL_IP, IP_RECVERR, &val, sizeof(val) ) == -1 ){ perror("setsockopt: "); return -1; } int bwrite = send( fd, "abcdefg", 7, 0 ); if( bwrite == -1 ){ perror("send: "); return -1; } char buf[1024]; char control_buf[1024]; struct msghdr msg; struct iovec iov = { buf, 1024 }; memset( &msg, 0, sizeof(msg) ); msg.msg_iov = &iov; msg.msg_iovlen = 1; msg.msg_control = &control_buf; msg.msg_controllen = 1024; int bread = recvmsg( fd, &msg, MSG_ERRQUEUE ); if( bread == -1 ){ perror("recv: "); return -1; } if( control_msg( &msg ) >= 0 ) printf("successed!\n"); else printf("failed!\n"); close( fd ); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -