Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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
用linux-C语言发送UDP套接字_C_Linux_Sockets_Udp - Fatal编程技术网

用linux-C语言发送UDP套接字

用linux-C语言发送UDP套接字,c,linux,sockets,udp,C,Linux,Sockets,Udp,我知道这显然是一个基本问题,我知道有很多教程和现成的例子,但我肯定遗漏了一些东西。例如,我试图通过UDP套接字将文本char*发送到本地网络中的其他机器。到目前为止,我尝试了一些教程,如等,但我总是在绑定函数中遇到错误,errno无法分配请求的地址 我只是在char数组中有一些数据,我想通过网络将它们推送到另一台主机。有人能给我指一下正确的方向吗?我需要套接字服务器还是客户端?我需要将套接字绑定到某个接口吗 这是我的游乐场: #include <stdio.h> #include &

我知道这显然是一个基本问题,我知道有很多教程和现成的例子,但我肯定遗漏了一些东西。例如,我试图通过UDP套接字将文本char*发送到本地网络中的其他机器。到目前为止,我尝试了一些教程,如等,但我总是在绑定函数中遇到错误,errno无法分配请求的地址

我只是在char数组中有一些数据,我想通过网络将它们推送到另一台主机。有人能给我指一下正确的方向吗?我需要套接字服务器还是客户端?我需要将套接字绑定到某个接口吗

这是我的游乐场:

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

int handle;

int init_socket()
{
        handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

        if (handle <= 0)
        {
                printf("failed to create socket\n");
                return 1;
        }

        printf("sockets successfully initialized\n");

        return 0;
}

int main ()
{
        unsigned short port = 30000;
    char * data = "hovno";

    init_socket();

        struct sockaddr_in address;

    memset((char *) &address, 0, sizeof(address));

        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("192.168.11.129"); // this is address of host which I want to send the socket
        address.sin_port = htons(port);


    printf("handle: %d\n", handle); // prints number greater than 0 so I assume handle is initialized properly

        if (bind(handle, (const struct sockaddr*) &address, sizeof(struct sockaddr_in)) < 0)
        {
                printf("failed to bind socket (%s)\n", strerror(errno)); // Cannot assign requested address
                return 1;
        }

        int nonBlocking = 1;
        if (fcntl(handle, F_SETFL, O_NONBLOCK, nonBlocking) == -1)
        {
                printf("failed to set non-blocking\n");
                return 2;
        }

        int sent_bytes = sendto(handle, data, strlen(data), 0, (const struct sockaddr*) &address, sizeof(struct sockaddr_in));

        if (sent_bytes != strlen(data))
        {
                printf("failed to send packet\n");
                return 3;
        }

    return 0;
}
为要将数据包接收到的本地地址调用bind。IP地址必须是机器的本地IP地址,或者最常见的IP地址

通常,您根本不必在客户端使用bind。系统将自动为您选择合适的空闲端口

要指定UDP套接字的远程地址,请使用sendto,而不是send

如果您在谷歌搜索udp客户端c代码,第一个结果是。您可以看到,网络部分基本上只有两个调用,socket和sendto。

bind是为您想要接收数据包的本地地址调用的。IP地址必须是机器的本地IP地址,或者最常见的IP地址

通常,您根本不必在客户端使用bind。系统将自动为您选择合适的空闲端口

要指定UDP套接字的远程地址,请使用sendto,而不是send


如果您在谷歌搜索udp客户端c代码,第一个结果是。您可以看到,网络部分基本上只有两个调用,socket和sendto。

您应该绑定本地地址,或者如果您不关心发送套接字的端口号,则根本不绑定本地地址。远程地址在“发送到”中指定。不能将远程地址绑定到本地套接字,这不是绑定的工作方式。您仍然需要在服务器端调用bind来指定端口号。我尝试发送数据,所以应该在这里使用udp套接字的服务器部分?所以我需要绑定两个地址?第一个地址是我的本地服务器地址,在sendto部分,我指定了我要发送数据的地址?我需要指定确切的端口,因为我尝试将此数据发送到VoIP客户端,以便此客户端能够以客户端侦听特定端口的正确方式处理数据。发送端应调用socket和sendto。不需要调用bind,您不必调整套接字的本地地址。远程地址在sendto中指定。只需从代码中删除“绑定”部分,就可以了。如果不关心发送套接字的端口号,则应该绑定本地地址,或者根本不绑定。远程地址在“发送到”中指定。不能将远程地址绑定到本地套接字,这不是绑定的工作方式。您仍然需要在服务器端调用bind来指定端口号。我尝试发送数据,所以应该在这里使用udp套接字的服务器部分?所以我需要绑定两个地址?第一个地址是我的本地服务器地址,在sendto部分,我指定了我要发送数据的地址?我需要指定确切的端口,因为我尝试将此数据发送到VoIP客户端,以便此客户端能够以客户端侦听特定端口的正确方式处理数据。发送端应调用socket和sendto。不需要调用bind,您不必调整套接字的本地地址。远程地址在sendto中指定。只需从代码中删除“绑定”部分,它就可以工作了。