WSACleanup(); return -1; } }
// 获取当前系统时间 SYSTEMTIME st; GetLocalTime(&st); char sDateTime[30]; sprintf(sDateTime,
\,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
// 打印输出的信息
printf(\Recv From Client [%s:%d] :%s\\n\, sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf);
/*if (buf[0] == 'q'&&buf[1] == 'u'&&buf[2] == 'i'&&buf[3] == 't') {
num--;
cout << \当前连接数:\ }*/
// 如果客户端发送quit字符串,则服务器退出 if(strcmp(buf, \) == 0) {
num--;
cout << \当前连接数:\ << num << endl;
retVal = send(sClient,\,strlen(\),0); break; }
else // 否则向客户端发送回显字符串 {
char msg[BUF_SIZE];
sprintf(msg, \, buf); while(true) {
// 向服务器发送数据
retVal = send(sClient, msg, strlen(msg),0); if(SOCKET_ERROR == retVal) {
int err = WSAGetLastError();
if(err == WSAEWOULDBLOCK) // 无法立即完成非阻塞套接字上的操作
{
Sleep(500);
continue; } else {
printf(\); closesocket(sClient); WSACleanup(); return -1; } }
break; }
} }
// 关闭套接字
closesocket(sClient); return 0; }
int _tmain(int argc, _TCHAR* argv[]) {
WSADATA wsd; // WSADATA变量,用于初始化Windows Socket SOCKET sServer; // 服务器套接字,用于监听客户端请求
SOCKET sClient; // 客户端套接字,用于实现与客户端的通信 int retVal; // 调用各种Socket函数的返回值
// 初始化套接字动态库
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) {
printf(\); return 1; }
// 创建用于监听的套接字
sServer = socket(AF_INET,SOCK_STREAM, IPPROTO_IP); if(INVALID_SOCKET == sServer) {
printf(\); WSACleanup(); return -1; }
// 设置套接字为非阻塞模式 int iMode = 1;
retVal = ioctlsocket(sServer, FIONBIO, (u_long FAR*) &iMode);
if(retVal == SOCKET_ERROR) {
printf(\); WSACleanup(); return -1; }
// 设置服务器套接字地址 SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(9990); // 监听端口为9990 addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // 绑定套接字sServer到本地地址,端口9990 retVal = bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN)); if(SOCKET_ERROR == retVal) {
printf(\); closesocket(sServer); WSACleanup(); return -1; }
// 监听套接字
retVal = listen(sServer, SOMAXCONN); if(SOCKET_ERROR == retVal) {
printf(\); closesocket(sServer); WSACleanup(); return -1; }
// 接受客户请求
printf(\);
int addrClientlen = sizeof(addrClient); // 循环等待 while(true) {
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); if(INVALID_SOCKET == sClient) {
int err = WSAGetLastError();
if(err == WSAEWOULDBLOCK) // 无法立即完成非阻塞套接字上的操作
{
Sleep(100); continue;
}
}
// 创建专用通信线程
num++;
cout << \当前连接数:\ << num << endl;
printf(\
connect %d,port:%d\\n\,sClient,ntohs(addrClient.sin_port));
CreateThread(NULL, NULL, AnswerThread, (LPVOID)sClient, 0,NULL); }
// 释放套接字
closesocket(sServer); WSACleanup();
// 暂停,按任意键退出 system(\); return 0; }