Tag: udp

绑定到特定的IP地址和端口以接收UDP数据

我正在尝试接收由PlayCap( http://www.signal11.us/oss/playcap/ )广播到网络地址192.168.103.255端口3000的UDP数据。 我遇到了绑定到此地址和端口的问题。 这是我的Java代码: public static void main(String[] args) { try { DatagramSocket s = new DatagramSocket(); InetSocketAddress address = new InetSocketAddress(“192.168.103.255”, 3000); s.bind(address); byte buffer[] = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); System.out.println(“Waiting…”); s.receive(packet); System.out.println(“Received!”); } catch (Exception e) { e.printStackTrace(); } } 这会返回错误: java.net.SocketException: already bound at java.net.DatagramSocket.bind(Unknown Source) at […]

将小型UDP数据包从Linux内核发送到LOOPBACK

情况:我的代码基本上被黑客入侵了Linux内核的驱动程序。 我想在用户空间中通知一个关于值得注意的原始事件的应用程序,然后才能将它们发送到主系统。 解决方案的步骤:我在这里找到了一个从内核空间发送UDP数据包的好例子: http : //kernelnewbies.org/Simple_UDP_Server 。 他们使用INADDR_LOOPBACK作为目标地址,这正是我想要的。 由于这是中断上下文,我决定使用工作队列来发送数据包(我得到了BUG:在没有它的情况下进行primefaces调度)。 因此,我的发送代码基于kernelnewbies代码,该代码包含在主进程中使用INIT_WORK和schedule_work触发的工作队列结构中。 我没有宣布自己的工作队列。 我没有使用Netpoll API,因为此问题表明无法从localhost发送数据。 “你不能发给自己” 问题:从内核发送并从我的UDP接收器接收的数据很少匹配。 我不知道为什么会这样。 用于测试的虚拟数据的代码,包括工作队列的结构的定义: static struct socket *sock_send; static struct sockaddr_in addr_send; static struct ksocket_workmessage { unsigned char *buf; int len; struct work_struct workmessage; } workmsg; unsigned char testmsg[] = {‘T’, ‘e’, ‘s’, ‘t’, ‘i’, ‘n’, ‘g’, ‘m’, ‘s’, ‘g’, ‘\0’}; workmsg.buf […]

在TCP流中发送消息

TCP是基于流的,这意味着您发送字节而不必将它们放在“消息”中,因此接收方可能会收到一半消息或三分之二的消息。 因此,在每个消息都是固定大小的游戏中,如果我收到一部分消息,我可以将其保留在缓冲区中,直到我收到另一部分。 这有点单调乏味,但还有其他基于消息的可靠协议吗? 可能有,但是在操作系统中没有像TCP和UDP那样实现,所以我必须使用一些库,只要它易于使用就可以了。 我总是可以制作一个有点可靠的UDP协议。 你有什么建议的?

套接字编程:sendto总是以errno 22(EINVAL)失败

我总是没有发送任何字节,使用此代码的错误为22(EINVAL,无效参数)。 destination_host在别处设置并且已知有效,所以我真的看不到发生了什么。 MAXMSGSIZE是1000.没有错误或警告。 我正在使用-Wall -Werror -pedantic编译 char *data_rec; u_int data_len; int sockfd; uint16_t *ns; struct sockaddr_in address; struct sockaddr *addr; char *ip; int i; int errno; int bytes_sent; data_len = MAXMSGSIZE; data_rec = malloc(sizeof(char)*MAXMSGSIZE); ns = malloc(MAXMSGSIZE*sizeof(uint16_t)); ip = malloc(MAXMSGSIZE*sizeof(char)); data_rec = “some random test stuff”; sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if(sockfdh_addr,ip,MAXMSGSIZE); memset(&address, 0, sizeof(address)); […]

UDP和套接字,recvfrom()返回-1,资源暂时不可用

我有一个客户端和一个服务器与C中的数据报(UDP)通信。客户端发送5个消息,并在收到消息后,服务器发回消息。 在客户端完成接收消息之前,接收和发送消息是很好的。 服务器发回所有消息后,它将使用close()终止。 所以来自客户端的recvfrom()应该返回0,对吗? 假设recvfrom()应该在服务器端close()时返回0,它返回-1,而错误资源暂时不可用。 此资源是否是从服务器关闭套接字的引用? 或者它是否与完全不同的东西完全不同,如用完缓冲区或其他东西(我认为不是这样)? 假设我的假设是错误的,并且由于服务器终止而返回-1,我可能应该处理错误 if(SOMEMACRO) do something 我怎样才能知道SOMEMACRO是什么? 我打印出错误,但它说资源临时不可用,recvfrom()描述没有提到无法使用的资源..? 顺便说一句,这是一个非阻塞套接字,如果这有任何区别,因为我读到如果设置O_NONBLOCK并且没有可用的消息,它会将errno设置为EAGAIN或EWOULDBLOCK。 O_NONBLOCK未设置但MSG_DONTWAIT已设置。 它们与一般文件描述符的O_NONBLOCK基本相同,而MSG_DONTWAIT是否是特定于套接字的? 我的大脑现在没有那么好用,如果有人可以启发我并澄清我的困惑,我会深深体会到这一点。 谢谢!

C中的UDP套接字

我正在为课堂上的家庭作业问题做准备。 我想启动一个侦听文件请求的UDP服务器。 它打开文件并使用UDP将其发送回请求客户端。 这是服务器代码。 // Create UDP Socket if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror(“Can’t create socket”); exit(-1); } // Configure socket memset(&server, 0, sizeof server); server.sin_family = AF_INET; // Use IPv4 server.sin_addr.s_addr = htonl(INADDR_ANY); // My IP server.sin_port = htons(atoi(argv[1])); // Server Port // Bind socket if ((bind(sockfd, (struct sockaddr *) […]

c udp带有recvfrom和select的非阻塞套接字

我想在客户端实现具有select函数的非阻塞套接字。 但它没有按预期工作。 在下面的代码中,它永远不会运行到else,rv始终为1,当没有任何内容时,套接字应用程序停止一段时间,并在套接字上有另一条消息时继续。 我不希望这种行为,我希望当socket上没有任何东西要重新发送时,客户端会将消息发送回服务器。 fd_set readfds; fcntl(sd, F_SETFL, O_NONBLOCK); while (1) { FD_ZERO(&readfds); FD_SET(sd, &readfds); rv = select(sd + 1, &readfds, NULL, NULL, NULL); if(rv == 1){ nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen); } else { printf(“I’m never here so I can’t send message back to the server!\n”); } } […]

调用setsockopt时出错“No such device”

我有一个代码,其中发送多播数据报。 一段重要的代码: uint32_t port; int sockfd, err_ip; const uint32_t sizebuff = 65535 – (20 + 8); unsigned char *buff = (unsigned char *) malloc(sizebuff); struct sockaddr_in servaddr, cliaddr; struct in_addr serv_in_addr; struct ip_mreq req; port = str2uint16(cmdsrv->ipport); bzero(buff, (size_t)sizebuff); bzero(&servaddr, sizeof(servaddr)); bzero(&serv_in_addr, sizeof(serv_in_addr)); err_ip = inet_aton(cmdsrv->ipaddr, &serv_in_addr); if(( err_ip != 0 ) && ( port […]

为什么特定的UDP消息总是低于特定的缓冲区大小?

3个不同的消息以不同的速率发送到同一个端口: 消息 大小(字节) 发送每个 传输速度 高 232 10 ms 100Hz 中等 148 20ms 50Hz 低 20 60 ms 16.6Hz 我每隔约6毫秒只能处理一条消息。 单线程。 阻止阅读。 一种奇怪的情况正在发生,我没有解释。 当我将接收缓冲区设置为4,799字节时,我的所有低速消息都会被丢弃。 我看到可能有一两个被处理,然后什么都没有。 当我将接收缓冲区设置为4,800 (或更高!)时,似乎所有低速消息都开始被处理。 我看到大约每秒16/17。 这一点一直被观察到。 发送数据包的应用程序始终在接收应用程序之前启动。 创建套接字后,在开始处理之前,接收应用程序总是有很长的延迟。 因此,处理开始时缓冲区始终为满,并且每次测试发生时它都不是相同的起始缓冲区。 这是因为套接字是在发送方已经发送消息之后创建的,因此接收方可能会在发送周期的中间开始监听。 为什么增加单个字节的接收缓冲区大小会导致低速消息处理发生巨大变化? 我构建了一个表来更好地可视化预期的处理: 由于其中一些消息得到处理,因此可能会将更多消息放入队列而不是被丢弃。 尽管如此,我希望4,799字节缓冲区的行为与4,800字节相同。 然而,这不是我所观察到的。 我认为这个问题与低速消息与其他两条消息同时发送的事实有关。 它总是在高/中速信息之后接收。 (已通过wireshark确认)。 例如,假设缓冲区开始时为空,很明显低速消息需要比其他消息排队更长。 *每6ms 1条消息大约每30ms发送5条消息。 这仍然不能解释缓冲区大小。 我们正在运行VxWorks,并使用他们的sockLib,它是Berkeley套接字的一个实现。 这是我们的套接字创建的代码片段: 我正在改变SOCKET_BUFFER_SIZE 。 struct sockaddr_in tSocketAddress; // Socket address […]

如何通过UDP CFSocket发送数据包?

我是一个完整的网络新手,但我是ac / c ++程序员,我正在使用objective-c(这是针对OSX / iPhone)。 我正在尝试学习如何使用cfsocket发送带有UDP套接字的魔术包。 我已经看到有像AsyncUDPSocket库这样的库,但是我不想使用它们。 我试图查看苹果UDPecho文件,但作为一个初学者它确实让我困惑。 我用Google搜索了ALOT,我把下面的代码放在一起,我有一个数据包嗅探器正在运行,它没有注册任何被发送的内容。 我理解我的代码缺少很多错误捕获,但我只是想先了解基础知识。 这段代码对吗? (道歉,如果这种接缝含糊不清)我的意思是我错过了代码的某些阶段,例如:CFSocketSetAddress? 如果有人知道任何非常好的教程,它会有所帮助。 非常感谢任何帮助,因为我是一个完整的初学者。 谢谢 int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; CFSocketRef WOLsocket; WOLsocket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL); if ( socket == NULL) { NSLog(@”CfSocketCreate Failed”); }else{ if( socket ) […]