一个简单的winsocket编程

eTouX 2010-04-02 07:50:12
这几天在学习socket,不是很了解send()和recv()具体情况,我想实现两台机子的文件传输,用的代码如下,为什么并不可以实现文件传输,请各位朋友给我解释下好么。
客户端
while(文件还没结束){
fgets(buf, 1024, fp);
send(...);
}

接收端
while(文件没结束){
recv(...);
fputs(buf, fp);
}
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
diablox0147 2010-04-03
  • 打赏
  • 举报
回复
可以在客户端开一个新的线程,专门用来写入数据。
每次有数据收过来先别急着写入,而是把这个数据放到待写入的列表里,让一个专门写入的线程来处理。

或者每次服务端发送后等待客户端发来消息,然后再继续发下一个。。。

不知道这样可不可行
cattycat 2010-04-03
  • 打赏
  • 举报
回复
if (recv(acpt, buf, 1024, 0) < 1024)

这里应该是小于等于1024吧,万一发送方的数据长度是1024了,就被当成错误了。当然你这里发送方不可能是1024.
eTouX 2010-04-03
  • 打赏
  • 举报
回复
谢谢各位为我解惑,我已经调试成功了。错误的原因是IO函数没用对。
eTouX 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cattycat 的回复:]
recv不用sleep,这个是阻塞的,就怕服务器发送速度过快,中间造成丢失数据。
[/Quote]
我接收端是这样写的:
	do {
memset(buf, 0, 1024);
if (recv(acpt, buf, 1024, 0) < 1024) {
fputs(buf, fp);
printf("%s",buf);
break;
}
fputs(buf, fp);
}while(1);

发送端是这样写的,
	fp = fopen(dir, "r");

while (ret = get_buf(fp,buf)){
printf(".");
Sleep(800);
send(sock, strlen(buf), 1024, 0);

}

send(sock, buf, strlen(buf), 0);
printf("\n文件传输成功.\n");

END:
fclose(fp);

请问我错在哪了?
cattycat 2010-04-02
  • 打赏
  • 举报
回复
recv不用sleep,这个是阻塞的,就怕服务器发送速度过快,中间造成丢失数据。
jbz001 2010-04-02
  • 打赏
  • 举报
回复
不了解这个,你应该去MFC专区问问
liuxingjin 2010-04-02
  • 打赏
  • 举报
回复
思路没有问题,应该是写调用库函数的时候哪里写错了
liuxingjin 2010-04-02
  • 打赏
  • 举报
回复
没有数据发过来的时候 阻塞等待
eTouX 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cattycat 的回复:]
这个逻辑看起来没什么问题啊。为了等待处理速度匹配,还是发送端sleep一下吧

C/C++ code
while(文件还没结束){
fgets(buf, 1024, fp);
send(...);
Sleep(2000);//2s
}
[/Quote]
recv()要延时么?
对于这个recv()函数,我不是很了解,如果
while(1)
{
recv(s, buf, 1024, 0);
}
是不是每一次都接受1024字节,还有如果没数据发过来是不是也接到1024字节数据?
某某9 2010-04-02
  • 打赏
  • 举报
回复
不懂socket,帮顶~~
cattycat 2010-04-02
  • 打赏
  • 举报
回复
这个逻辑看起来没什么问题啊。为了等待处理速度匹配,还是发送端sleep一下吧
while(文件还没结束){
fgets(buf, 1024, fp);
send(...);
Sleep(2000);//2s
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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