Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
简单C udp客户端/服务器失败_C_Sockets_Unix_Udp - Fatal编程技术网

简单C udp客户端/服务器失败

简单C udp客户端/服务器失败,c,sockets,unix,udp,C,Sockets,Unix,Udp,我试图编写一个服务器程序,只显示它通过udp从任何人那里接收到的任何原始数据。客户机可以随时向其发送一些数据。除了“套接字错误:资源暂时不可用”之外,没有出现任何错误,换句话说,这意味着recvfrom没有要接收的数据(因为它可能没有收到任何数据包) 客户端只是将“test!”发送到127.0.0.0:12345,而服务器使用端口12345上的非阻塞套接字进行侦听。值得一提的是,我使用的是linux 为什么服务器没有显示它显然是从客户端发送的数据包?我不知道我错过了什么 普通的 我传递了一个指向

我试图编写一个服务器程序,只显示它通过udp从任何人那里接收到的任何原始数据。客户机可以随时向其发送一些数据。除了“套接字错误:资源暂时不可用”之外,没有出现任何错误,换句话说,这意味着
recvfrom
没有要接收的数据(因为它可能没有收到任何数据包)

客户端只是将“test!”发送到127.0.0.0:12345,而服务器使用端口12345上的非阻塞套接字进行侦听。值得一提的是,我使用的是linux

为什么
服务器
没有显示它显然是从
客户端
发送的数据包?我不知道我错过了什么

普通的
我传递了一个指向
address
的指针,我本应该在common.h->sendTo()中传递指向
addr
的指针

最重要的是,我将数据包发送到127.0.0.0,而这本应该是127.0.0.1(谢谢@yano)

更正代码:

int sendData(uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint16_t port, int handle, char* packet_data, int packet_size)
{
    uint32_t address = (a << 24) | (b << 16) | (c << 8) | d;

    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(address);
    addr.sin_port = htons(port);

    int sent_bytes = sendto(handle, (const char*)packet_data, packet_size, 0, (sockaddr*)&addr, sizeof(sockaddr_in));

    if (sent_bytes != packet_size)
    {
        printf("failed to send packet (%d/%d)\n", sent_bytes, packet_size);
        return 0;
    }
}
int发送数据(uint32\u t a、uint32\u t b、uint32\u t c、uint32\u t d、uint16\u t端口、int句柄、字符*数据包、int数据包大小)
{

uint32_t address=(一个不调用UDP的
listen
:“sockfd参数是一个文件描述符,它引用类型为SOCK_STREAM或SOCK_SEQPACKET的套接字”。也就是说,listen仅用于TCP。
if(!listen(socket,0))<代码> >该检查是错误的。<代码> 0 意味着成功。因此,您应该检查<代码> -1 < /C> >,您会看到其中有一个错误。也许使用127.0.0.1:也考虑使用转换字符串“xxx .xxx .xxx .xxx”。二进制文件的ipv4地址address@yano原来你是对的!还有一个问题把整个事情搞砸了。请参阅答案。自我提示:将“addr”重命名为“remote”或“server”
#include "common.h"
#include <time.h>

void main(void){
    int socket = createSocket(12345);
    if (!socket){
        perror("Socket error");
    }
    int true=1;
    setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (const void*)&true, 1);
    // so that we can immediately reuse the port if the server stops running

    char buffer[100] = "No data";
    if(!listen(socket, 0)){
        perror("Socket error");
    }

    //struct timespec delay = {0,33333333}; // 30Hz
    struct timespec delay = {0,100000000}; // 100Hz

    int running = 1;
    int ret = 0;
    while(running){
        ret = recvfrom(socket, &buffer, 100, 0, NULL, NULL);
        if (ret < 0){
            perror("Socket error");
        } else if (ret > 0){
            printf("%d: %s\n", ret, buffer);
        }

        nanosleep(&delay,NULL); 
    }
}
#include "common.h"

void main(void){
    int socket = createSocket(0);
    printf("Started client on port %d\n", socket);

    if(!sendData(127,0,0,0,12345, socket, "test!", 5)){
        perror("Socket error");
    } else {
        printf("Sent data.\n");
    }
}
int sendData(uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint16_t port, int handle, char* packet_data, int packet_size)
{
    uint32_t address = (a << 24) | (b << 16) | (c << 8) | d;

    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(address);
    addr.sin_port = htons(port);

    int sent_bytes = sendto(handle, (const char*)packet_data, packet_size, 0, (sockaddr*)&addr, sizeof(sockaddr_in));

    if (sent_bytes != packet_size)
    {
        printf("failed to send packet (%d/%d)\n", sent_bytes, packet_size);
        return 0;
    }
}