您的位置:首页 > 其它

004.UDP--拼接UDP数据包,构造ip头和udp头通信(使用原始套接字)

2015-11-19 20:55 661 查看
一.大致流程:

建立一个client端,一个server端,自己构建IP头和UDP头,写入数据(hello,world!)后通过原始套接字(SOCK_RAW)将包发出去。

server端收到数据后,打印UDP数据并发送确认消息(yes),client收到yes后将其打印。

二.其中:

client端IP:192.168.11.104 端口:8600

server端IP:192.168.11.105 端口:8686

三.注意事项:

1.运行原始套接字socket需要有root权限。

2.注意主机字节序和网络字节序的转

四.涉及的数据结构

1.ip部分的结构图:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define HOST_IP "192.168.11.105"
#define HOST_PORT 8686

#define MAXLINE 1024*50

int main()
{
int server_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET, SOCK_DGRAM, 0);

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(HOST_IP);
server_address.sin_port = htons(HOST_PORT);

server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

for( ; ; )
{
int len;
char recv_mesg[MAXLINE];
char send_mesg[20];
client_len = sizeof(struct sockaddr_in);
printf("server2 waiting!\n");
len = recvfrom(server_sockfd, recv_mesg, MAXLINE, 0, (struct sockaddr *) &client_address, (socklen_t *) &client_len);
printf("收到包的长度为:%d\n",len);
printf("%s\n",recv_mesg);
strcpy(send_mesg,"yes");
sendto(server_sockfd, send_mesg, strlen(send_mesg), 0, (struct sockaddr *) &client_address, client_len);  //将包发出去
}
return 0;
}


server.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: