#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
//#define FD_SETSIZE 128 //fd_set默认为64。可以强制更改为128。可以fd_set转定义查看,fd_set中FD_SETSIZE指的是fd_set可以处理的socket个数(64即指的是63个客户端socktet加一个服务器socket)。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<WinSock2.h>//网络库。<WinSock.h>
#pragma comment(lib,"Ws2_32.lib")//只有32位的。<Wsock32.lib>对应<WinSock.h>库。
int main(void)
{
WORD wdVersion = MAKEWORD(2, 2);//传入MAKEWORD宏里,存入wdVersion里。
//MAKEWORD:原理((WORD)(((BYTE)(((DWORD_PTR)(a))&0xff))| ((WORD)(((BYTE)(((DWORD_PTR)(b)) &0xff)))<<8))。
WSADATA wdScokMsg;
//LPWSADATA lpw = malloc(sizeof(WSADATA));
//int a = *((char*)&wdVersion);
//int b = *((char*)&wdVersion+1);
//WSAStartup(wdVersion, lpw);
int nRes = WSAStartup(wdVersion, &wdScokMsg);
if (0 != nRes)
{
switch (nRes)
{
case WSASYSNOTREADY:
printf("重启下电脑试试,或者检查网络库。\n");
break;
case WSAVERNOTSUPPORTED:
printf("请更新网络库。\n");
break;
case WSAEINPROGRESS:
printf("请重新启动软件。\n");
break;
case WSAEPROCLIM:
printf("请尝试关掉不必要的软件,以为当前网络运行提供充足的资源。\n");
break;
/*case WSAEFAULT://参数问题。
break;*/
}
}
//校验版本。
if (2 != HIBYTE(wdScokMsg.wVersion) || 2 != LOBYTE(wdScokMsg.wVersion))
{
//说明版本不对。
//清理网络库。
WSACleanup();
return 0;
}
SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//成功返回可用的socket。失败返回INVALID_SOCKET。
//int a = WSAGetLastError();//检测最近的系统定义函数。
if (INVALID_SOCKET == socketServer)
{
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//创建失败。
//清理网络库。
WSACleanup();
return 0;
}
//绑定地址与端口。
struct sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(12345);//端口号
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (SOCKET_ERROR == bind(socketServer, (const struct sockaddr*)&si, sizeof(si)))//失败返回SOCKET_ERROR。成功返回0。
{
//出错了,SOCKET_ERROR是一个int类型的-1。
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//释放
closesocket(socketServer);
//清理网络库。
WSACleanup();
return 0;
}
//监听。
if (SOCKET_ERROR == listen(socketServer, SOMAXCONN))
{
//出错了,SOCKET_ERROR是一个int类型的-1。
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//释放
closesocket(socketServer);
//清理网络库。
WSACleanup();
return 0;
}
//定义一个装客户端socket的结构。四个操作fd_set参数宏:FD_ZERO,将集合清零;FD_SET:向集合中添加一个socket;FD_CLR:集合中删除指定socket;FD_ISSET:判断一个socket是否在一个集合中。
fd_set clientSockets;
FD_ZERO(&clientSockets);//清零。
FD_SET(socketServer,&clientSockets);//添加一个元素。
FD_CRL(socketServer,&clientSockets);//删除指定元素。一定要close。
//closesocket(socketServer);
FD_ISSET(socketServer,&clientSockets);//判断一个元素是否在集合中。在返回非0,不在返回0。
//关闭释放。
closesocket(socketServer);
//清理网络库。
WSACleanup();
free(lpw);
system("pause");
return 0;
}