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);}
} 展开
为什么服务器端在未接受到客户端信息是会等待(不会重复循环)
而客户端在未接收到服务器端反馈时,会不断的重复运行下去呢? 谢谢!!
(分别如下图)
===================服务器端程序=====================
// 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);}
} 展开
展开全部
因为服务器是一对多客户端;
而对于客户端来说,是1对1服务器;
所以,服务器在等待某个客户端的时候,去执行其他客户端的请求。
而对于客户端来说,是1对1服务器;
所以,服务器在等待某个客户端的时候,去执行其他客户端的请求。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-08-01
展开全部
等等,我再看看,你的服务器一直是accept状态,这是阻塞的,没有接收到连接,函数不会结束(返回),你可试试非阻塞
更多追问追答
追问
是accept才有阻塞状态,recv没有阻塞状态是吗?怪不得。
那么,能否让客户端也有阻塞状态呢?(服务器未启动的时候,等服务器启动了再发下一条消息)
追答
与函数无关,recv也是阻塞的。你可以将套接字设置成阻塞的,不过对于函数返回值做判断,验证是否正常收发
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的客户端出现这种情况的时候,是因为服务端没启动,是么
更多追问追答
追问
是的,服务器没启动。我故意不启动服务器,看看客户端会是什么反应。
追答
则accept()阻塞调用进程直至新的连接出现
recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;
这就是2者的区别
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说有的系统调用都没有检测返回值。至少connect要判断一下再做下一步处理吧。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询