但是每次和客户端交流时都只能交流2,3次就断了,不知道什么原因
#include<WinSock2.h>
#include<Windows.h>
#include<iostream>
#pragma comment(lib,"WS2_32.lib")
using namespace std;
int main()
{
WSADATA wsadata;
int nret;
SOCKADDR_IN clientAddr;
int clientlen = sizeof(clientAddr);
//SOCKET connect;
// SOCKET acceptSocket;
nret = WSAStartup(MAKEWORD(2, 2), &wsadata);
if (nret != 0)
{
cout << "wsastartup error" << endl;
return -1;
}
int nPort = 5150;
//创建监听套接字
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//绑定套接字到本地机器
if (bind(sListen, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
{
cout << "failed bind()" << endl;
return -1;
}
//进入监听模式
listen(sListen, 5);
//select模型处理过程
//1)初始化一个套接字集合fdSocket,添加监听套接字句柄到这个集合
fd_set fdSocket;
fd_set writeSet;
fd_set readSet;
FD_ZERO(&fdSocket);
FD_SET(sListen, &fdSocket);
//FD_SET(connect, &fdSocket);
while (true)
{
//2)将fdSocket集合的一个拷贝fdRead传递给select函数,
//当有事件发生时,select函数移除fdRead集合中没有未决I/O操作的套接字句柄
//然后返回
FD_ZERO(&readSet);
FD_ZERO(&readSet);
readSet = fdSocket;
writeSet = fdSocket;
//FD_ZERO(&fdwrite);
if (SOCKET_ERROR == select(0, &readSet, &writeSet, NULL, NULL))
{
printf("select() returned with error %d\n", WSAGetLastError());
return -1;
}
//检查是否存在客户端的连接
// }
//遍历套接字
for (int i = 0; i < fdSocket.fd_count; i++)
{
SOCKET sAccept = fdSocket.fd_array[i];
if (FD_ISSET(sAccept, &readSet))
{
if (sAccept == sListen) {
//接收数据
sockaddr_in addrRemote;
int nAddrlen = sizeof(addrRemote);
SOCKET sNew = accept(sListen, (SOCKADDR*)&addrRemote, &nAddrlen);
FD_SET(sNew, &fdSocket);
printf("接收到连接%s\n", inet_ntoa(addrRemote.sin_addr));
}
else {
char szText[2048];
int nRecv = recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
if (nRecv > 0)
{
szText[nRecv] = '\0';
cout << "接收到数据:" << szText << endl;
}
else {
cout << "接收失败" << endl;
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
if (FD_ISSET(sAccept, &writeSet))
{
//发送数据
// SOCKET sAccept = fdSocket.fd_array[i];
char sendmessage[2048];
cout << "输入发送数据:" << endl;
cin >> sendmessage;
send(sAccept, sendmessage, strlen(sendmessage), 0);
//closesocket(sAccept);
closesocket(fdSocket.fd_array[i]);
FD_CLR(fdSocket.fd_array[i], &fdSocket);
}
}
}
}
return 0;
}