Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UDP数据报中指定的端口号和中sockaddr_中的端口号_C_Linux_Sockets_Network Programming - Fatal编程技术网

UDP数据报中指定的端口号和中sockaddr_中的端口号

UDP数据报中指定的端口号和中sockaddr_中的端口号,c,linux,sockets,network-programming,C,Linux,Sockets,Network Programming,在linux中: 我正在编写一个代码来实现UDP套接字 我想填充udp头字段,所以我必须分配源端口号和目标端口号 例如: struct udphdr *udph //UDP header udph->source = htons (6666); udph->dest = htons (8622); 此外,我还必须在中准备struct sockaddr_,其中包含端口号字段,例如: //internet socket structure struct sockaddr_in

在linux中:

我正在编写一个代码来实现UDP套接字

我想填充udp头字段,所以我必须分配源端口号和目标端口号

例如:

struct udphdr *udph    
//UDP header
udph->source = htons (6666);
udph->dest = htons (8622);
此外,我还必须在中准备struct sockaddr_,其中包含端口号字段,例如:

//internet socket structure
struct sockaddr_in sin; 
sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sockaddr_in结构中的端口号值与UDP标头中的端口号值之间是否存在任何关系

分配这些值的正确方法是什么

这是我的全部代码:

#include <stdio.h> 
#include <unistd.h> //sleep         
//socket headers
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h> //when socket creation failed
//#include <netinet/tcp.h>   //Provides declarations for tcp header
#include <netinet/udp.h>   //Provides declarations for udp header
#include <netinet/ip.h>    //Provides declarations for ip header
#include <stdlib.h> //for exit();
#include <string.h> //memset
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
    //declarations
    int sokt_fd;
    //buffers
    char datagram[80];// 80 bytes datagram
    char *data;//buffer for payload
    //code here
    //Create a udp socket
    if((sokt_fd=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <0)
    {
        //socket creation failed, may be because of non-root privileges
        perror("Failed to create socket");
        exit(1);
    }
    //zero out the packet buffer
    memset (datagram, 0, 80);
    //UDP header
    struct udphdr *udph = (struct udphdr *) datagram;//assign startof udp
    //Data part
    data = datagram + sizeof(struct udphdr);//assigin location of data
    strcpy(data , "ABC");
    //UDP header
    udph->source = htons (6666);
    udph->dest = htons (8622);
    udph->len = htons(8 + strlen(data)); //UDP header size
    //disable checksum
    udph->check = 0; //leave checksum 0 now, filled later by pseudo header
    //internet socket structure
    //destination IP address, and port
    //http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv
    struct sockaddr_in sin; 
    sin.sin_family = AF_INET;
    sin.sin_port = htons(80);
    sin.sin_addr.s_addr = inet_addr ("10.0.0.2"); //destenation IP address,

    //sending the datagram:
    while(1)
    {
        if (sendto (sokt_fd,datagram,udph->len,0/*int flags*/,(struct sockaddr *) &sin, sizeof (sin))<0)
        {
            perror("sendto failed");
        }
        else
        {
            printf ("Packet Send. Length : %d \n" , udph->len);

        }
        sleep(5);
    }
    return 0;
}
#包括
#包括//睡眠
//套接字标头
#包括
#包括
#套接字创建失败时包含//个
//#include//提供tcp头的声明
#include//提供udp头的声明
#include//提供ip头的声明
#包括//用于退出();
#include//memset
#包括
#包括
int main()
{
//声明
int sokt_fd;
//缓冲区
char数据报[80];//80字节数据报
char*data;//有效负载的缓冲区
//代码在这里
//创建udp套接字
如果((sokt_fd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))源=htons(6666);
udph->dest=htons(8622);
udph->len=htons(8+strlen(数据));//UDP头大小
//禁用校验和
udph->check=0;//现在保留校验和0,稍后由伪标头填充
//因特网套接字结构
//目标IP地址和端口
//http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#sendtorecv
sin中的结构sockaddr_;
sin.sin_family=AF_INET;
sin.sin_端口=htons(80);
sin.sin_addr.s_addr=inet_addr(“10.0.0.2”);//去激活IP地址,
//发送数据报:
而(1)
{
if(sendto(sokt_fd,数据报,udph->len,0/*int flags*/,(struct sockaddr*)和sin,sizeof(sin))len);
}
睡眠(5);
}
返回0;
}

如果使用IPPROTO_UDP套接字,就不会弄乱UDP头

这是将UDP发送到端口6666上的127.0.0.1的代码片段

struct in_addr in;
struct sockaddr_in sdest;

memset(&sdest, 0, sizeof(sdest));
sdest.sin_family = AF_INET;
sdest.sin_port = htons(6666);

inet_aton("127.0.0.1", &in);
sdest.sin_addr.s_addr = in.s_addr;
r = sendto(sock, data, size, 0, (struct sockaddr *) &sdest, (socklen_t) sizeof(sdest));

但是你也应该看看
bind
。这允许你接收东西(总是有用的),但您主要应该看看W Richard Stevens等人的ISBN 0-13-141155-1在
Unix网络编程中的优秀示例。

您是否使用原始套接字进行UDP通信?在哪里以及如何使用UDP标头结构?在哪里以及如何使用
结构中的
sockaddr\u?我已经添加了完整的代码,敬请指教重新看一看。当您使用TCP或UDP的标准函数时,标头(TCP/UDP和IP标头)由网络堆栈填充,您不必对此做任何事情。您只需“担心”关于是
sendto
中使用的
sockaddr_in
结构。如果使用原始套接字,您只需担心头。如果我将套接字更改为原始类型,我必须如何在UDP头和sockaddr_中填充端口号?除非确实需要,否则不要使用原始套接字。与正常TCP或UDP通信时,不需要使用原始套接字o使用原始套接字(然后还必须处理IP头)。使用问题代码中显示的普通UDP套接字,使用
结构中的
sockaddr\u和
sendto
。就是这样。
bind()
建立用于套接字的本地ip/端口,以便用于设置出站数据包的源ip/端口,而
sendto()的参数设置数据包的目标ip/端口。