Tag: recv

从带有MSG_ERRQUEUE标志的recvmsg读取ICMP有效负载

我正在使用BSD套接字来构建一个不需要root权限的高级traceroute程序(如tracepath)。 使用UDP和绑定套接字,我调用: recvmsg(socket, header, MSG_ERRQUEUE) 我收到有关先前发送的数据包已触发的假定ICMP通知的信息。 您知道是否可以访问ICMP有效负载(应该是先前发送的数据包)? 我从recvmsg手册页中读到: [..] The payload of the original packet that caused the error is passed as normal data via msg_iovec. [..] 但是我找不到任何有用的东西,它只是随机数据(我用wireshark来交叉检查数据)。

c recv()读取直到换行发生

我正在用C编写一个IRC机器人,并遇到了麻烦。 在我的主要function中,我创建了我的套接字并连接,所有这些快乐的东西。 然后我有一个(几乎)无限循环来读取从服务器发回的内容。 然后我将读取的内容传递给辅助函数processLine(char *line) – 问题是,以下代码读取直到我的缓冲区已满 – 我希望它只读取文本直到换行符(\ n)或回车符(\ r)发生(从而结束该行) while (buffer[0] && buffer[1]) { for (i=0;i<BUFSIZE;i++) buffer[i]='\0'; if (recv(sock, buffer, BUFSIZE, 0) == SOCKET_ERROR) processError(); processLine(buffer); } 最终发生的事情是,许多线路都被卡在一起,当发生这种情况时,我无法正确处理线路。 如果您不熟悉IRC协议,可以简要总结一下,当发送消息时,它通常如下所示:YourNickName!YourIdent@YourHostName PRIVMSG #someChannel :The rest on from here is the message sent…例如,登录通知是这样的:the.hostname.of.the.server ### bla some text bla ,###是用于处理的代码(?) – 即372是一个指示符以下文字是每日信息的一部分。 当它全部卡在一起时,我无法读取什么行的数字,因为我找不到行开始或结束的位置! 我非常感谢你的帮助! PS:这是在Linux上编译/运行,但我最终想把它移植到Windows,所以我尽可能多地制作它。 PSS:这是我的processLine()代码: void […]

Raw Socket Linux发送/接收数据包

在接收数据包时遇到一些问题。 我可以接收和读取传入的数据包,但我想我不会与任何主机握手。 我只想在收到答案的情况下将数据包发送到具有开放端口的远程计算机,以查看TTL(生存时间)和窗口大小。 有谁知道错误在哪里? (我对C编程知之甚少) 码: #include #include #include #include #include #include #include #include #include #include #include struct pseudohdr { u_int32_t src_addr; u_int32_t dst_addr; u_int8_t padding; u_int8_t proto; u_int16_t length; }; struct data_4_checksum { struct pseudohdr pshd; struct tcphdr tcphdr; char payload[1024]; }; unsigned short comp_chksum(unsigned short *addr, int len) { long sum = 0; […]

在C ++中使用’recg’和’MSG_PEEK’获取套接字中可用的字节数

C ++具有以下函数来从套接字接收字节,它可以检查MSG_PEEK标志可用的字节数。 使用MSG_PEEK ,’recv’的返回值是socket中可用的字节数: #include ssize_t recv(int socket, void *buffer, size_t length, int flags); 我需要在不创建buffer情况下获取套接字中可用的字节数(不为buffer分配内存)。 有可能吗?怎么样?

在套接字关闭时取消阻止recvfrom

假设我开始在端口上接收线程。 套接字调用将阻止recvfrom。 然后,不知何故在另一个线程中,我关闭套接字。 在Windows上,这将取消阻止recvfrom,我的线程执行将终止。 在Linux上,这不会解锁recvfrom,因此,我的线程永远不会做任何事情,并且线程执行不会终止。 任何人都可以帮助我解决Linux上发生的事情吗? 当套接字关闭时,我希望recvfrom解除阻塞 我一直在阅读有关使用select()的内容,但我不知道如何将它用于我的特定情况。

从Java-Client接收数据(数据包含int,short,string)

我正在寻找几个小时来得到关于我的问题的答案,但没有找到任何答案。 也许我在这里得到一些帮助。 我正在尝试做什么:Java-Client向C-Server发送消息。 该消息包含不同的类型,如整数,短和字符串(例如,message = int:total_msg_length; short:operation; string:hello – > total_msg-length = 4(整数的大小),operation = 2(short的大小) ,hello = 5(每个字母是1个字节= 5)。 那么,我如何在服务器中收到消息? 下面的代码接收一个Integer(工作正常)。 下一步将是接收短路然后接收一个字符串(以US-ASCII转换)。 int *msg; int recv_size; int final_msg; if( (recv_size = recv(client_socket, &msg, sizeof(msg), 0 )) < 0 ){ error_exit("Fehler bei recv(message_len)"); } final_msg = endian_swap(msg); printf("Message: %d\n", final_msg); return final_msg; 有没有办法使用字节数组而不是char缓冲区? 我感谢每一个帮助。 请原谅我的英语不好,我来自德国:-)

对send()的多次调用合并为一次调用recv()

我有一个客户端 – 服务器应用程序。 客户端使用两个不同的send()调用发送一个字符串,后跟一个整数。 这两个数据应该存储在服务器上的两个不同变量中。 问题是发送的两个变量都是在recv()调用时收到的。 因此,由两个不同的send() s send()的两个字符串被链接并存储在第一个recv()的缓冲区中。 server.c: printf(“Incoming connection from client %s:%i accepted\n”,inet_ntoa(clientSocketAddress.sin_addr),ntohs(clientSocketAddress.sin_port)); memset(buffer,0,sizeof(buffer)); int sizeofMessage; if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0)==sizeofMessage)<0) { printf("recv failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } char* Name=buffer; printf("Name: %s\n",Name); if ((recv(clientSocket,buffer,MAXBUFFERSIZE,0))<0) { printf("bind failed."); closesocket(serverSocket); clearWinsock(); return EXIT_FAILURE; } int integer=ntohs(atoi(buffer)); printf("integer: %i\n",intero); client.c: if (send(clientSocket,Name,strlen(Name),0)!=strlen(Name)) { printf(“send failed”); closesocket(clientSocket); clearWinsock(); […]