C语言中SOCKET关于send和recv的问题,不懂别乱贴

-----这个server中的循环while(1){structsockaddr_inlink_addr;intlink_fd;socklen_tlink_addr_le... -----这个server中的循环
while(1)
{
struct sockaddr_in link_addr;
int link_fd;
socklen_t link_addr_len;

link_addr_len = sizeof(link_addr);
memset(&link_addr, 0x00, sizeof(link_addr));
link_fd = accept(server_fd, (struct sockaddr*)&server_addr, &link_addr_len);
send(link_fd, welcome_msg, sizeof(welcome_msg), 0);
memset(buff, 0x00, sizeof(buff));

recv(link_fd, buff, MAX_LEN,0);
printf("%s",buff);

}

-------这是client中的发送
if(recv(link_fd, buff, MAX_LEN,0) <0)
printf("recv fail");
printf("%s",buff);
memset(buff, 0x00, sizeof(buff));
sprintf(buff,"haha,i get your message");
send(link_fd, buff, strlen(buff)+1,0);
close(link_fd);

--------问题来了
在client中得发送send在执行完毕后,服务器什么都收不到,而吧send语句改成一个while循环服务器就可以收到,这个是为什么?
展开
 我来答
海狮2D
2011-12-16 · TA获得超过3019个赞
知道大有可为答主
回答量:1904
采纳率:55%
帮助的人:1004万
展开全部
说实在的这个问题非常简单,不过你习惯太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事实。
否则还可能有Socket问题。
如果是linux,strace一下就知道什么问题了。
Windows的也很简单。

前面的明显不正确,send如果是TCP,(UDP 不应该用send),send返回时,消息已经发出了。
追问
的确是TCP的,不过我还没整明白是什么问题,经过我的调试,发现是服务器这端的问题
而且检查返回值我也检查了,只是发到网上的时候我把代码精简掉了
追答
说实在的,服务器的那个recv会收到什么跟setsockopt关系很大,和操作系统关系也不小。TCP又没有规定每次必须收到多少东西。尤其是O_NONBLOCK很可能会出现你遇到的问题,这种不完整的程序要让人说问题不是不可能,是成本很高。因为只有很少的从业人员可以不看源代码指出源代码的问题。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不宜然EG
2011-12-16 · TA获得超过102个赞
知道答主
回答量:236
采纳率:0%
帮助的人:131万
展开全部
原因,Send后,立即关闭了连接。这个时候数据没有发送出去。关闭的时候,服务器recv直接返回0
追问
我在send后面插入sleep和while(1)依旧不可以,看来问题不在这里
追答
你这里肯定是有问题,而且这也是会引起这个问题,至于其他的,在上面的程序看不到
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hb756091339
2011-12-16 · TA获得超过368个赞
知道小有建树答主
回答量:181
采纳率:100%
帮助的人:101万
展开全部
你在send后加个延时试试,可能是你还没发送完毕就关掉了连接的原因
更多追问追答
追问
我在send后面插入sleep和while(1)依旧不可以,看来问题不在这里
追答
方便的话把你程序发给我调试一下试试吧,不好说哪里问题,你要会用调试,自己追踪一下就好
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式