因为我要接收多台客户端发送过来的数据,所以,我把buff和socketf写到一个结构体里。就出现这样的错误。下面是源码。
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
struct myevent_s
{
int fd;
char name[50];
char buff[200];
int len;
};
myevent_s()
{
fd=0;
memset(name,0,sizeof(name));
memset(buff,0,sizeof(buff));
len=0;
};int main()
{
// 加载win socket
WSADATA ws;
int ret;
ret = WSAStartup(MAKEWORD(2, 2), &ws);
if (ret != 0)
{
printf("WSAStartup() 失败!\n");
return -1;
}
// 创建侦听SOCKET
SOCKET sListen;
sListen = socket(AF_INET, SOCK_STREAM, 0);
if (sListen == INVALID_SOCKET)
{
printf("socket() 失败!\n");
return -1;
}
// 填充服务器地址结构
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = INADDR_ANY;
servAddr.sin_port = htons(4567); // 绑定服务器套接字
ret = bind(sListen, (sockaddr*)&servAddr, sizeof(servAddr));
if (ret == SOCKET_ERROR)
{
printf("bind() 失败!\n");
return -1;
} // 开始侦听
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() 失败!\n");
return -1;
}
printf("服务器启动成功,在端口%d监听…\n", ntohs(servAddr.sin_port));
//使用select模型
// 创建套接字集合
fd_set allSockSet; // 总的套接字集合
fd_set readSet; // 可读套接字集合
fd_set writeSet; // 可写套接字集合 FD_ZERO(&allSockSet); // 清空套接字集合
FD_SET(sListen, &allSockSet); // 将sListen套接字加入套接字集合中
char bufRecv[100]; // 接收缓冲区
// 进入服务器主循环
while(1)
{
FD_ZERO(&readSet); // 清空可读套接字
FD_ZERO(&writeSet); // 清空可写套接字
readSet = allSockSet; // 赋值
writeSet = allSockSet; // 赋值
// 调用select函数,timeout设置为NULL
ret = select(0, &readSet, 0, NULL, NULL);
//
if (ret == SOCKET_ERROR)
{
printf("select() 失败!\n");
return -1;
}
// 存在套接字的I/O已经准备好
if(ret > 0)
{
// 遍历所有套接字
for (int i = 0; i < allSockSet.fd_count; ++i)
{
SOCKET s = allSockSet.fd_array[i];
// 存在可读的套接字
if (FD_ISSET(s, &readSet))
{
// 可读套接字为sListen
if (s == sListen)
{
// 接收新的连接
sockaddr_in clientAddr;
int len = sizeof(clientAddr);
SOCKET sClient = accept(s, (sockaddr*)&clientAddr, &len);
// 将新创建的套接字加入到集合中
FD_SET(sClient, &allSockSet);
printf(">>>>>有新的连接到来啦…\n");
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
else // 接收客户端信息
{
struct myevent_s *ev=(struct myevent_s*)allSockSet.fd_array[i];
int len; len=recv(s,ev->buff,sizeof(ev->buff)-1,0);
if(len>0)
{
ev->len+=len;
ev->buff[len]='\0';
printf("收到的消息:%s\n", ev->buff);
}
// 接收错误
else if (len == SOCKET_ERROR)
{
DWORD err = WSAGetLastError();
printf("%d\n",err);
if (err == WSAECONNRESET)
printf("客户端被强行关闭\n");
else
printf("recv() 失败!");
// 删除套接字
FD_CLR(s, &allSockSet);
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
else if (len == 0)
{
printf("客户端已经退出!\n");
// 删除套接字
FD_CLR(s, &allSockSet);
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
} // end else
}// end if
}// end for
} // end if
}//end while
return 0;
}现在出现这个10053错误,解决不了。麻烦大神指导下。selectsocket服务器
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
struct myevent_s
{
int fd;
char name[50];
char buff[200];
int len;
};
myevent_s()
{
fd=0;
memset(name,0,sizeof(name));
memset(buff,0,sizeof(buff));
len=0;
};int main()
{
// 加载win socket
WSADATA ws;
int ret;
ret = WSAStartup(MAKEWORD(2, 2), &ws);
if (ret != 0)
{
printf("WSAStartup() 失败!\n");
return -1;
}
// 创建侦听SOCKET
SOCKET sListen;
sListen = socket(AF_INET, SOCK_STREAM, 0);
if (sListen == INVALID_SOCKET)
{
printf("socket() 失败!\n");
return -1;
}
// 填充服务器地址结构
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = INADDR_ANY;
servAddr.sin_port = htons(4567); // 绑定服务器套接字
ret = bind(sListen, (sockaddr*)&servAddr, sizeof(servAddr));
if (ret == SOCKET_ERROR)
{
printf("bind() 失败!\n");
return -1;
} // 开始侦听
ret = listen(sListen, 5);
if (ret == SOCKET_ERROR)
{
printf("listen() 失败!\n");
return -1;
}
printf("服务器启动成功,在端口%d监听…\n", ntohs(servAddr.sin_port));
//使用select模型
// 创建套接字集合
fd_set allSockSet; // 总的套接字集合
fd_set readSet; // 可读套接字集合
fd_set writeSet; // 可写套接字集合 FD_ZERO(&allSockSet); // 清空套接字集合
FD_SET(sListen, &allSockSet); // 将sListen套接字加入套接字集合中
char bufRecv[100]; // 接收缓冲区
// 进入服务器主循环
while(1)
{
FD_ZERO(&readSet); // 清空可读套接字
FD_ZERO(&writeSet); // 清空可写套接字
readSet = allSockSet; // 赋值
writeSet = allSockSet; // 赋值
// 调用select函数,timeout设置为NULL
ret = select(0, &readSet, 0, NULL, NULL);
//
if (ret == SOCKET_ERROR)
{
printf("select() 失败!\n");
return -1;
}
// 存在套接字的I/O已经准备好
if(ret > 0)
{
// 遍历所有套接字
for (int i = 0; i < allSockSet.fd_count; ++i)
{
SOCKET s = allSockSet.fd_array[i];
// 存在可读的套接字
if (FD_ISSET(s, &readSet))
{
// 可读套接字为sListen
if (s == sListen)
{
// 接收新的连接
sockaddr_in clientAddr;
int len = sizeof(clientAddr);
SOCKET sClient = accept(s, (sockaddr*)&clientAddr, &len);
// 将新创建的套接字加入到集合中
FD_SET(sClient, &allSockSet);
printf(">>>>>有新的连接到来啦…\n");
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
else // 接收客户端信息
{
struct myevent_s *ev=(struct myevent_s*)allSockSet.fd_array[i];
int len; len=recv(s,ev->buff,sizeof(ev->buff)-1,0);
if(len>0)
{
ev->len+=len;
ev->buff[len]='\0';
printf("收到的消息:%s\n", ev->buff);
}
// 接收错误
else if (len == SOCKET_ERROR)
{
DWORD err = WSAGetLastError();
printf("%d\n",err);
if (err == WSAECONNRESET)
printf("客户端被强行关闭\n");
else
printf("recv() 失败!");
// 删除套接字
FD_CLR(s, &allSockSet);
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
else if (len == 0)
{
printf("客户端已经退出!\n");
// 删除套接字
FD_CLR(s, &allSockSet);
printf("目前客户端数目为:%d\n", allSockSet.fd_count - 1);
}
} // end else
}// end if
}// end for
} // end if
}//end while
return 0;
}现在出现这个10053错误,解决不了。麻烦大神指导下。selectsocket服务器
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货