⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udp_socket.c

📁 一个基于linux的TCP/IP协议栈的实现
💻 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 + -