Tag: udp

用于LAN计算机发现和服务器设置的UDP广播

我正在开发一个小型的网络游戏原型,它将使用UDP在局域网上播放。 为了发现网络上的其他计算机,我一直在调查广播。 但是,我仍然不确定有关UDP套接字设置/使用的一些细节(网络新手)。 我发现在游戏开始后可以使用一个很好的库,但首先,必须发现所有运行游戏的计算机,并且必须选择一个作为服务器。 所以我的问题如下: 可以使用单个UDP套接字来监听和发送广播吗? 我很确定答案是肯定的,但我想validation它。 使用UDP时,你真的必须使用bind()吗? 据我所知, connect()不是必需的,也不是send()/recv() ,因为它们是用于TCP( sendto()/recvfrom()作为替换)。

如何在C中创建UDP服务器?

我正在尝试用C编写UDP服务器(在Linux下)。 我知道在socket()函数中我必须使用SOCK_DGRAM而不是SOCK_STREAM 。 if ( (list_s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 ) { fprintf(stderr, "ERROR"); } 但是现在,当我尝试运行程序时(编译时没有错误),它表示listen()中存在错误。 这是对它的调用: if (listen(list_s, 5) < 0) { fprintf(stderr, "ERROR IN LISTEN"); exit(EXIT_FAILURE); } 你能弄明白问题是什么吗? 这是代码: int list_s; /* listening socket */ int conn_s; /* connection socket */ short int port; /* port number */ struct sockaddr_in servaddr; […]

c中的udp聊天服务器

我想用c语言编写udp聊天服务器。 我以前写过tcp聊天服务器,没关系。 在tcp服务器中,accept函数返回一个fd号,服务器根据这个fd号与特定客户端通信。 但是在udp中,我怎么能听一个特定的客户? 在我的tcp服务器中,在客户端连接到服务器之后,创建一个线程并监听该客户端。 因此对于每个客户端,都有一个线程根据从accept函数返回的fd号进行监听。 所以任何消息都可以根据这个fd号发送给特定的客户端。 我怎样才能在udp服务器中实现这一点? 谢谢你的回答。

动态更改源IP地址

我有一个服务器有几个不同的IP地址。 此时,每个IP都可以接收UDP请求,但它始终与回复的IP相同,请求者不喜欢。 总而言之,这是所有基本代码: int sock; socklen_t clilen; struct sockaddr_in serv_addr, cli_addr; memset((char*)&serv_addr, 0, sizeof(serv_addr)); sock = socket(AF_INET, SOCK_DGRAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(PORT); … recvfrom(sock, buffer, BUFLEN, 0, (struct sockaddr *)&cli_addr, &clilen); … sendto(sock, resData, resLen, 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr)); 我希望能够以某种方式指定哪个IP用于发送回我的数据包(这可能因每个请求而有所不同),但我不知道如何使用套接字实现这一点。 我在这个领域并不是那么有经验,所以我能得到的所有帮助都非常感激。 编辑如下 我已经在接受的答案中找到了一个潜在的解决方案: 如何在Linux中重新绑定udp套接字 但是,出现了一个新问题。 我如何知道哪个IP /接口收到了请求? 这样我就可以使用该IP […]

如何在C中读取可变长度的UDP数据包

我正在通过UDP发送一个C结构 struct packet{ int numInt; int* intList; //malloc’ed as (sizeof(int)*numInt) } 它将被序列化为[numInt][intList[0]]…[intList[numInt-1]] 。 我的理解是,在UDP上调用recvfrom将读取整个数据包,即使缓冲区不包含那么多字节。 使用一个非常大的缓冲区我唯一的选择?

接收来自N个客户端的响应,以响应UDP上的广播请求

我正在为特定类型的网络多媒体设备实现一种IP查找器。 我想找出局域网中所有类型的活动设备,包括它们的IP地址和其他细节。 该设备有自己的设备发现方式。 它的工作原理如下:客户端通过UDP通过LAN发送广播请求。 目标端口号是固定的。 作为回应,LAN中理解此请求格式的所有服务器都将响应此请求,提供有关自身的信息。 我正在使用sendto()广播UDP请求消息。 现在我的问题是我不知道有多少设备(ieservers)会响应请求。 我需要多少次调用recvfrom()? 我什么时候才能知道我已经处理了所有设备的响应? 或者一般来说,recvfrom()是从多个服务器接收响应的正确选择吗? 有没有更好的(或者如果我错在这里是正确的)完成相同的方式? 我正在用C / C ++编程,计划为Windows和Linux编写代码。 提前谢谢了。 编辑:所以在这里所有的网络编程向导的帮助下,我找到了我的问题的解决方案:) select()对我来说就是这个…… 非常感谢所有花时间帮助我的人

如何在c中的UDP套接字中设置源端口?

任何人都可以告诉我如何在UDP套接字中设置源端口地址吗? 我的客户端应用程序需要将数据包从57002端口发送到服务器端口58007。

是否可以将char *转换为结构体?

这是我的问题,其中一个rcvfrom()参数是一个char *,一旦我从中获取数据,我想将其转换为结构。 但是,演员阵容不成功。 我究竟做错了什么? 这是我做的: struct { int8_t seq; int8_t ack; bool flag; char data[payload]; }r_pckt; //…bunch of codes char *buf = NULL; buf = (char *)malloc (sizeof(char) * MTU); memset(buf, 0, MTU); //… res = recvfrom(socket_fd, buf, MTU, 0,(struct sockaddr *) &cli_addr, (socklen_t *)&cli_len); //.. r_pckt *tmp_pckt = (struct r_pckt *) &buf; 它不起作用。 有任何想法吗? […]

在UDP中接收错误:连接被拒绝

我试图在特定端口通过UDP向服务器发送字符串HI,然后接收响应。 但是,在我尝试使用recvfrom()获取响应后,我陷入阻塞状态。 我尝试使用连接的UDP,但我得到: 在UDP中接收错误:连接被拒绝 这可能是什么原因? 服务器不在我的控制之下,但我知道它工作正常。 我添加了代码 int sockfdudp; char bufudp[MAXDATASIZE], port[6]; struct addrinfo hints, *servinfo, *p; struct sockaddr_storage addr; int rv; char s[INET6_ADDRSTRLEN]; int bytes_recv, bytes_sent; socklen_t len; scanf(“%s”,port); printf(“UDP Port: %s \n”, port); // Start connecting to datagram server memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(SERVER_NAME, […]

在C中进行UDP广播

当我通过下面的代码广播消息时,主机上的服务器也会收到消息,如何防止主机接收它发送的消息? 是否可以更改代码上的内容,或者更好地使用if (strcmp(hostIP == IP_of_the_package) == 0) { } ? 主机从DHCP获取IP,如何将hostIP as a variable定义hostIP as a variable如何提取IP addr of the packet ? void boardcast_msg(char *mess){ int sock; struct sockaddr_in broadcastAddr; char *broadcastIP; unsigned short broadcastPort; char *sendString; int broadcastPermission; int sendStringLen; broadcastIP = “255.255.255.255”; broadcastPort = 33333; sendString = mess; /* string to broadcast */ […]