linux c语言 socket编程 recv每次收到一样的数据

#include
#include
#include
#include
#include
#include
#include
#include
#include
int main() {
int so=socket(AF_INET,SOCK_STREAM,0),r;
sockaddr_in addr;
hostent hp;
hp=gethostbyname("www.csdn.net");
addr.sin_addr.s_addr=
((unsigned long*)hp->h_addr);
addr.sin_family=AF_INET;
addr.sin_port=htons(80);
connect(so,(sockaddr*)&addr,sizeof(sockaddr));
char message[200]="GET / HTTP/1.0\r\nHost:www.csdn.net\r\n\r\n";
send(so,message,strlen(message)+1,0);
char buf[1024]={0};
while(recv(so,buf,1024,MSG_PEEK)){
puts(buf);
memset(buf,0,1024);
}
}
就这样一直收不完,请问为什么
谢谢

4个回答

Please Don't use "MSG_PEEK",If you use it ,you will recv the same message !!!

u011767611
Landpack 回复luckywang1103: I am sorry ! My OS is English Version !!Yeah ! you are right !!.. candidate expects MSG_OOB,MSG_PEEK,MSG_WAITALL,arguments ...
5 年多之前 回复
luckywang1103
luckywang1103 顶,楼上说的有道理,MSG_PEEK标志会将套接字接收队列中的可读的数据拷贝到缓冲区,但不会使套接字接收队列中的数据减少,常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,而指定了MSG_PEEK标志,可通过返回值获得可读数据长度,并且不会减少套接字接收缓冲区中的数据,所以可以供程序的其他部分继续读取。
5 年多之前 回复

HTTP GET 方式,你每次发送的 GET 指令都相同,接收到的内容是一样这很正常;接收到的不一样,个人认为才是不正常的。

91program
91program 回复Gemnpal: 你的接收Buf的大小只有1024,如果接收不完,你怎么知道有 1400?按你所说,应该是接收了两次,一次是1024,另一次就是 1400-1024,即剩余的部分数据。第一次接收到 1024 时,如果做为字符串来处理,你的 buf 就没有字符串结束符了!这样按字符串来操作,会出现越界的问题。先将这个问题改了,再看看吧。
5 年多之前 回复
Gemnpal
不知道什么昵称 回复91program: 但是在我的程序里只发了一个请求,请问为什么recv每次都收到同样的数据而且收不完,而且每次都不全,只有1400B
5 年多之前 回复
Gemnpal
不知道什么昵称 回复91program: 但是在我的程序里只发了一个请求,请问为什么recv每次都收到同样的数据而且收不完,而且每次都不全,只有1400B
5 年多之前 回复
91program
91program 回复Gemnpal: 用 recv返回0来判断结束是不对的。recv 要不接收到一定的数据,要不接收不到数据被挂起、直到有数据再次被接收到。
5 年多之前 回复
Gemnpal
不知道什么昵称 回复91program: 我是准备多次接收然后recv返回0结束接收,但发现每次接收到的都和第一次的一样,就没有后面的了,而且收不完
5 年多之前 回复
91program
91program 一次接收的数据,分多次接收到,数据每次接收后接收缓冲区中的数据会自动清除的。所以,你要先分析一下,接收的、相同的数据,是否是完整的、你想要的数据?
5 年多之前 回复

你fwencsdn,页面返回内容很多吧,你buf开大一点呢。这样i一次可以多处理一些。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐