//问题:一旦被客户端触发以后,会不断发送数据并且自己可以接受(本机测试时),进入“发送——》接收”的死循环
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <time.h>
#include <signal.h>
#include <stdio.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>
void raws_respon(int sockfd,struct sockaddr* pcliaddr,socklen_t clilen)
{
int n,hlen1;
char msg[1024];
socklen_t len;
struct ip *ip;
struct sockaddr_in *addr;
char *data;
union {
int s;
char c[sizeof(int)];
} un;
for(;;)
{
n=0;
len=clilen;
n=recvfrom(sockfd,msg,1024,0,pcliaddr,&len);
if(n>0)
{
ip = (struct ip *) msg;
hlen1 = ip->ip_hl << 2; //IP首部长度=ip->ip_hl×4
printf("ip_P: %d----",ip->ip_p);
// if((ip->ip_p!=14)||n<532)continue;//不是我们的数据不处理
data=(char*)(msg+hlen1);
addr=(struct sockaddr_in*)pcliaddr;
printf("recvfrom IP:%s data:%s n=%d\n",inet_ntoa(addr->sin_addr),data,n);
printf("sendto data : %s datalen=%d \n",data,strlen(data));
sprintf(msg,"get data:%s",data);
sendto(sockfd,msg,strlen(msg),0,pcliaddr,len);
}
else if(errno == EINTR)
continue;
else {
fprintf(stderr,"recvfrom error");
exit(1);
}
}
}
int main(int argc,char*argv[])
{
int sockfd;
struct sockaddr_in servaddr,cliaddr;
/* 创建一个RAW数据报类型的套接字 */
sockfd=socket(AF_INET,SOCK_RAW,14);//协议字段设置为14
if(sockfd<0)
{
fprintf(stderr,"Socket error! %s\n",strerror(errno));
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
if(argc!=2)
{
printf("./RAW_server IP地址 \n");
exit(1);
}
inet_aton(argv[1],&servaddr.sin_addr);
//servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//servaddr.sin_port=htons(SERVPORT);
/* 服务器为套接字绑定IP地址,地址为0时表示通配符 */
if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0)
{
fprintf(stderr,"Bind error");
exit(1);
}
/* 调用通信函数与客户端进行通信 */
raws_respon(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr)); //正常服务器通信处理
close(sockfd); /* 关闭套接字 */
}
UDP 原始套接口 网络 C 代码
4星 · 超过85%的资源 需积分: 10 56 浏览量
2012-11-21
23:45:19
上传
评论
收藏 2KB ZIP 举报
lianchengren
- 粉丝: 0
- 资源: 17
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈