c++中socket编程中的Select()总是给出时间错误
select() in socket programming c++ always giving time error
我有这个套接字程序,它有发送和接收的两个部分,但当我使用select时,它总是返回"时间错误"。下面是代码
void server::run(){
int RetVal;
struct timeval *tp=new timeval;
tp->tv_sec=300;
tp->tv_usec=500000;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sock,&readfds);
FD_SET(sock1,&readfds);
cout<<"run() is working fine";
if((RetVal=select(1,&readfds,NULL,NULL,tp))==SOCKET_ERROR) //check for incoming packets.
{
cout<< "Timer error!";
Sleep(50);
}
else if(RetVal>0) //There are incoming packets.
{
if(FD_ISSET(sock1, &readfds)) //incoming packet from peer host 1
{
send();
}
else if(FD_ISSET(sock, &readfds)) //incoming packet from peer host 1
{
send1();
}
else{
cout<<"no port is open to communicate";
}
}
}
server::server(){
WSADATA wsadata;
try{
if (WSAStartup(0x0202,&wsadata)!=0)
throw"Starting WSAStartup() errorn";
//Display name of local host
if(gethostname(servername,HOSTNAME_LENGTH)!=0) //get the hostname
throw"Get the host name error,exit";
}
catch(char *str){
cerr<<str<<":"<<WSAGetLastError()<<endl;
}
printf("Server: %s waiting to be contacted for time/size request...n",servername);
}
server::~server(){
WSACleanup();
}
void server::send(){
try{
if ((sock= socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
{
cout<< "SERVER: socket unable to initializen";
}
servers.sin_family = AF_INET;
servers.sin_port = htons(port);
servers.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, (sockaddr*)&servers, sizeof(servers)) == SOCKET_ERROR)
{
cout<<"SERVER: Cant Bind the Socket";
closesocket(sock);
}
if (listen(sock, MAXPENDING) == SOCKET_ERROR)
//if((value=listen(sock, MAXPENDING))==SOCKET_ERROR)
{
cout<<"SERVER: listening socket not open";
closesocket(sock);
}
if ((clientSock= accept(sock, 0, 0)) == SOCKET_ERROR)
{
throw"SERVER: connection not accepted";
}
if ((nBytes= send(clientSock, "Hello", 20, 0)) == SOCKET_ERROR)
{
throw"SERVER: data sending failed ";
}
}
catch(char *str){
cerr<<str<<":"<<WSAGetLastError()<<endl;
}
closesocket(clientSock);
closesocket(sock);
}
void server::send1(){
try{
if ((sock1= socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
{
throw "SERVER: socket unable to initializen";
}
servers.sin_family = AF_INET;
servers.sin_port = htons(port);
servers.sin_addr.s_addr = INADDR_ANY;
if (bind(sock1, (sockaddr*)&servers, sizeof(servers)) == SOCKET_ERROR)
{
throw"SERVER: Cant Bind the Socket";
closesocket(sock1);
}
if (listen(sock1, MAXPENDING) == SOCKET_ERROR)
{
throw "SERVER: listening socket not open";
closesocket(sock1);
}
cout << "SERVER: Ready to run now...";
if ((clientSock= accept(sock1, 0, 0)) == SOCKET_ERROR)
{
throw"SERVER: connection not accepted";
}
if ((nBytes= send(clientSock, "Hello", 20, 0)) == SOCKET_ERROR)
{
throw"SERVER: data sending failed ";
}
}
catch(char *str){
cerr<<str<<":"<<WSAGetLastError()<<endl;
}
closesocket(clientSock);
closesocket(sock1);
}
我已经尝试了很多东西,但我的select()总是返回相同的东西。我的程序在没有run()和select()的情况下工作正常,如果我直接调用send和recv(),其工作正常。
select
函数在错误时返回SOCKET_ERROR
(实际上是-1
),在超时时返回0
。当你得到一个错误(而不是超时)时,你应该使用WSAGetLastError
来获得实际的错误,并在例如这个列表中查找它。
您还应该将第一个参数设置为可移植的最高套接字数+ 1。
你有一个更大的问题,虽然,似乎你没有创建实际的套接字,直到之后你调用select
。这意味着select
调用中使用的套接字将是无效的,这就是您得到错误的原因。
通常首先创建套接字,将它们绑定到本地地址并将它们标记为侦听套接字。然后在套接字上执行select
,当可读时,它们有可以接受的传入连接。
我认为你需要重新考虑你的设计。
您还应该考虑在接受连接后会发生什么。现在你只需接受一个连接,发送一些文本,然后再次关闭它。但是,如果您想继续在接受的套接字上通信,并且可能有多个连接,则需要做更多的工作。
您还尝试创建两个绑定到相同本地地址的套接字,但这将不起作用。请记住,被动侦听套接字实际上可以接受任何数量的传入连接,而不仅仅是一个。
要检查哪些套接字可以接收数据,您可以使用例如select
,其中包含所有接受的连接,以及侦听套接字。
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 0xc000007b Windows 上的 OpenCL 库的加载时间错误
- std :: Invoke_result_t编译时间语法错误
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- STD :: FPCLASSIFY的错误结果使用Valgrind进行长时间的双重双重结果
- 此代码中运行时间错误的原因是什么
- 在NDK中启用链接时间优化时,链接器错误
- C1001反量时间的错误(无优化)
- 在输入结构对象的输入过程中运行时间错误
- 触发编译时间错误时,constexpr函数的超载被调用
- 类类型的静态constexpr字段在g++中给出链接时间错误
- 编译时间错误5
- XTGMATH.H具有编译时间错误
- 运行时间错误:程序跳过提示,以获取第二名和第三个名称
- c++中socket编程中的Select()总是给出时间错误
- 视觉工作室 - 编译C++程序时VS 2013中的链接时间错误 - B. Stroustrup的PPP使用C++:第8章 - Q1 钻探?