我正在尝试在连接时自动向客户端发送服务器请求,但我一直收到的WSAGetLastError为10057.我已经设置了从客户端到服务器的请求没有问题所以我不明白为什么我不能这样做相反 ?也许服务器必须等待来自客户端的第一个'发送',但我不明白为什么会这样?
我正在使用:
- 同步插座
-TCP
-s是有效的套接字
-i'v循环RequestInfo几次通过但没有任何变化
-select()返回0
-datasize返回-1,错误代码为10057
谢谢!!!
服务器
//first - following the debugger
FD_ACCEPT
int acc = accept(s, (struct sockaddr*)&fromm, &fromlenn); //success
if(acc <= 0)
{
eLOGG << "\nFAIL FD_ACCEPT: " << WSAGetLastError();
}
RequestInfo();
//then
RequestInfo()
{
stringstream ssConverter;
ssConverter.clear(); ssConverter.str(string());
ssConverter << "00aa"; //request signal
bool blogin = false;
eLOG << "signal is: *" << ssConverter.str() << "*";
int bufSize = ssConverter.str().length();
fd_set writefds;
struct timeval timeout;
timeout.tv_sec = 3;
timeout.tv_usec = 0;
FD_ZERO(&writefds);
FD_SET(s, &writefds);
int sel = select(s, NULL, &writefds, NULL, &timeout);
if(sel == SOCKET_ERROR)
{
eLOG << "\nselect - read fail: " << WSAGetLastError();
}
if(sel == 0)
{
eLOG << "\nselect - not connected: " << WSAGetLastError();
}
if (FD_ISSET(s, &writefds))
{
eLOG << "\n FD_ISSET";
}
eLOG << "\nauth socket is: " << s;
int dataSize = send(s, ssConverter.str().c_str(), bufSize, 0);
if(dataSize < bufSize)
{
eLOG << "\n FD_ISSET";
}
//...etc
}
答案 0 :(得分:8)
您正在混淆侦听服务器套接字 s
和连接套接字,这是您从accept()
acc
获得的变量。您无法通过服务器套接字发送或接收数据,因为它未连接任何内容。它的唯一目的是接受来自客户的新连接。毕竟,服务器通常会处理多个客户端。
顺便说一下,连接的套接字不会从服务器套接字继承非阻塞状态,所以你需要在每个accept()
后标记它。