socket的接收缓存中的数据没有读出时,会不会被后来的数据包覆盖?

花生切糖 2019-03-22 04:51:21
本人在用c++写一个ping局域网内所有可用ip的小程序时,首先创建一个socket:

rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

然后向本网段所有256个IP发送ICMP报文:

for(j = 0; j < 256; j ++)
{
bRet = Ping(SubNetIP[j], rawSocket);
}

然后在while循环中,利用同一个socket接收回复

while(1)
{
bRet = RecvEchoReply(rawSocket, &srcIP, &cTTL);
}

// 接收应答回复并进行解析
BOOL RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL)
{
ECHOREPLY echoReply;
int nRet;
int nAddrLen = sizeof(struct sockaddr_in);
UINT16 id, seq;
UINT16 type, code;

//接收应答回复
nRet = recvfrom(s, // 接收的套接字
(LPSTR)&echoReply, // 接收的缓冲区
sizeof(ECHOREPLY), // 缓冲区长度
0, // 标识
(LPSOCKADDR)lpsaFrom, // 接收的地址
&nAddrLen); // 地址结构长度

type = echoReply.echoRequest.icmpHdr.Type;
code = echoReply.echoRequest.icmpHdr.Code;
id = echoReply.echoRequest.icmpHdr.ID;
seq = echoReply.echoRequest.icmpHdr.Seq;

// 检验接收结果
if (nRet == SOCKET_ERROR)
{
printf("recvfrom() error:%d\n",WSAGetLastError());
return FALSE;;
}
// 记录返回的TTL
*pTTL = echoReply.ipHdr.TTL;

cout<<s<<" "<<id<<" "<<type<<" "<<code<<" "<<nRet<<endl;

return TRUE;
}

我用了recvfrom()来接收回复。
首先,不知道这种方法有没有问题?
然后,当同时收到多个IP的回复时,数据会不会相互覆盖?
...全文
260 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-03-22
  • 打赏
  • 举报
回复
仅供参考:
#include <windows.h>
#include <stdio.h>
#include <string.h>
char YN(int k) {
FILE *f;
char fn[40];
char ln[80];
char yn;
int n;

yn='N';
sprintf(fn,"d:\\ping%d.txt",k);
f=fopen(fn,"r");
if (NULL!=f) {
n=0;
while (1) {
if (NULL==fgets(ln,80,f)) break;//
if (strstr(ln,"ms ")) {
yn='Y';
break;//
}
n++;
if (n>=4) break;//
}
fclose(f);
}
return yn;
}
void main(int argc,char **argv) {
char cmdstr[256];
int i;
int IP[3];
char c;

if (argc<2) {
USAGE:
printf("Usage example:\n %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);
return;
}
if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {
if (0<=IP[0] && IP[0]<=255
&& 0<=IP[1] && IP[1]<=255
&& 0<=IP[2] && IP[2]<=255
&& '.'==c) {
for (i=1;i<255;i++) {
sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);
WinExec(cmdstr,SW_HIDE);
}
Sleep(3000);
for (i=1;i<255;i++) {
printf("%c %s%d\n",YN(i),argv[1],i);
}
Sleep(3000);
WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);
} else goto USAGE;
} else goto USAGE;
}
@风轻云淡_ 2019-03-22
  • 打赏
  • 举报
回复
不会被覆盖,如果一直没有读取,缓存数据会一直增加.好像是到达一个临界点就不再接受数据了,想深入了解可以搜索一下相关的专业资料.反正不会被覆盖便是.
smwhotjay 2019-03-22
  • 打赏
  • 举报
回复
数据不会被后面的数据覆盖。
但udp会长时间不处理好像会被抛弃。udp不太熟悉。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧