C++ recv函数的问题

同样是recv函数,独立运行时:为什么服务器端在未接受到客户端信息是会等待(不会重复循环)而客户端在未接收到服务器端反馈时,会不断的重复运行下去呢?谢谢!!(分别如下图)... 同样是recv函数,独立运行时:
为什么服务器端在未接受到客户端信息是会等待(不会重复循环)
而客户端在未接收到服务器端反馈时,会不断的重复运行下去呢? 谢谢!!
(分别如下图)

===================服务器端程序=====================
// WinSorkSrv.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#include <WinSock2.h>
#pragma comment(lib,"wsock32")//连接动态链接库wsock32.dll

void _tmain()//int argc, _TCHAR* argv[]
{
//定义动态链接库所需要的参数,加载动态链接库,并初始化
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1,1);//加载
WSAStartup(wVersionRequested,&wsaData);//初始化
//创建用于监听的“套接字”
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
//定义“套接字”的SOCKADDR结构对象,并设置其数据项
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4321);
//

//将套接字绑定到端口上
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字设为监听模式,监听5个客户
listen(sockSrv,5);
//创建一个新的SOCKADDR对象,用于与客户机通信
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);

while(1)
{

cout<<"等待客户端消息……"<<endl;
//监听端口,等待客户端的连接请求。(一旦连接,将用新的套接字进行通信。)
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient,&len);

char sendBuf[100] = ("这是服务器的回复:看到你了");
send(sockConn,sendBuf,strlen(sendBuf)+1,0);//向客户端发送信息
char recvBuf[100]="0";
recv(sockConn,recvBuf,100,0);//接收客户端发来的信息
cout<<"recvBuf = "<<recvBuf<<endl<<endl;

closesocket(sockConn);
}
WSACleanup();
}

===================客户端程序======================
// WinSorkClient.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
#include <WinSock2.h>
#pragma comment(lib,"wsock32")

void _tmain()
{
int count0 =0;

WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1,1);
WSAStartup(wVersionRequested,&wsaData);
while(1)
{
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(4321);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

string sendBuf0 = "这是客户端发送的消息.";
char tempchar[] = "初始化";
sprintf(tempchar, "%d", count0);
string sendBuf1 = tempchar;
sendBuf0 += sendBuf1;
cout<<"sendBuf0 = "<<sendBuf0<<endl;

const char *sendBuf = sendBuf0.c_str();

send(sockClient,sendBuf,strlen(sendBuf)+1,0);
count0++;
char recvBuf[100]="初始化";
recv(sockClient,recvBuf,100,0);
cout<<"recvBuf="<<recvBuf<<endl<<endl;

closesocket(sockClient);}
}
展开
 我来答
One_More_2013
2014-08-01 · TA获得超过682个赞
知道小有建树答主
回答量:1028
采纳率:50%
帮助的人:285万
展开全部
因为服务器是一对多客户端;
而对于客户端来说,是1对1服务器;
所以,服务器在等待某个客户端的时候,去执行其他客户端的请求。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-08-01
展开全部
等等,我再看看,你的服务器一直是accept状态,这是阻塞的,没有接收到连接,函数不会结束(返回),你可试试非阻塞
更多追问追答
追问
是accept才有阻塞状态,recv没有阻塞状态是吗?怪不得。
那么,能否让客户端也有阻塞状态呢?(服务器未启动的时候,等服务器启动了再发下一条消息)
追答
与函数无关,recv也是阻塞的。你可以将套接字设置成阻塞的,不过对于函数返回值做判断,验证是否正常收发
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
samplezuo
2014-08-01 · TA获得超过320个赞
知道小有建树答主
回答量:452
采纳率:100%
帮助的人:253万
展开全部
你的客户端出现这种情况的时候,是因为服务端没启动,是么
更多追问追答
追问
是的,服务器没启动。我故意不启动服务器,看看客户端会是什么反应。
追答
则accept()阻塞调用进程直至新的连接出现

recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;

这就是2者的区别
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jiangsanhuo
2014-08-01 · TA获得超过168个赞
知道小有建树答主
回答量:291
采纳率:81%
帮助的人:172万
展开全部
你说有的系统调用都没有检测返回值。至少connect要判断一下再做下一步处理吧。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式