关于socket编程的Select模型,该如何解决

关于socket编程的Select模型
今天写了个最简单的select模型,但是却不能连接,
麻烦大大们赏脸看下

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")

#include <iostream>
using namespace std;

#define Port 4567

int main(){
//初始化环境
WSADATA wsad;
if(WSAStartup(MAKEWORD(2,2),&wsad) != 0){
printf("初始化Socket环境失败,WSAStartup() failed!");
goto ending;
}

SOCKET sClient;

//初始化套接字句柄
sClient = ::socket(AF_INET ,SOCK_STREAM ,0);
if(sClient == SOCKET_ERROR){
printf("初始化套接字句柄失败,socket() failed!");
goto ending;
}
//初始化套接字
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.S_un.S_addr = INADDR_ANY;
saddr.sin_port = ::htons(Port);

if(::bind(sClient ,(sockaddr*)&saddr ,sizeof(saddr)) == SOCKET_ERROR){
printf("套接字与句柄绑定失败, bind() failed!");
goto ending;
}

if(::listen(sClient,5) == SOCKET_ERROR){
printf("监听套接字失败! listen() failed!");
goto ending;

}

printf("服务器启动成功!\n");


char buf[1024];
char wel[] = "欢迎您连上服务器!";


//所以套接字
fd_set fdSocketList;
//可读或接受的套接字
//fd_set fdRead;
//可写的套接字
fd_set fdWrite;

FD_ZERO(&fdSocketList);
FD_SET(sClient,&fdSocketList);
timeval time;
time.tv_sec = 1;
time.tv_usec = 0;
while(true){

//初始化套接字集合
//FD_ZERO(&fdRead);
//FD_ZERO(&fdWrite);
fd_set fdRead = fdSocketList;
fdWrite = fdSocketList;
printf("有请求");
int ret = ::select(0 , //偏移量
&fdRead , //可读的套接字集合
&fdWrite , //可写的套接字集合
NULL , //发生错误的套接字集合
&time //此次函数等待的最长时间,如果为NULL则为无限大
);

if(ret == SOCKET_ERROR ){
printf("select() failed!");
continue;
}


//如果有未完的io
if(ret > 0){
SOCKET sTemp;
for(int i = 0; i < (int)fdSocketList.fd_count ; i++ ){
sTemp = fdSocketList.fd_array[i];
//是否存在客户端的连接请求
if(FD_ISSET(sTemp,&fdRead)){
sockaddr_in sin;
int remoteLen = sizeof(sin);
SOCKET sNew = ::accept(sClient,(sockaddr*)&sin,&remoteLen);
//接受成功并且放入SOCKET句柄列表
if(sNew != INVALID_SOCKET){

FD_SET(sNew,&fdSocketList);
printf("接受到来自%s的连接",inet_ntoa(sin.sin_addr));
}else{

printf("有接受某套接字失败!");
}
}
if(FD_ISSET(sTemp,&fdRead)){
//读取操作

::recv(sTemp,buf,sizeof(buf),0);
}else{

closesocket(sTemp);
FD_CLR(sTemp,&fdRead);

}
if(FD_ISSET(sTemp,&fdWrite)){
//发送操作
send(sTemp,wel,sizeof(wel),0);
}

}//ret > 0 ?

}//while

}

ending:
system("pause");
return 1;
}


下面是客户端:
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")

int main(){
WSADATA    data;
WORD word1 = MAKEWORD(2,0);
WSAStartup(word1, &data);
SOCKET s; 

s = socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(75);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
printf("客户端启动\n");
if(::connect(s,(sockaddr *) &addr,sizeof(addr)) != SOCKET_ERROR){
printf("连接成功");
}
char buf[20] ={0};
::recv(s,buf,sizeof(buf),0);
printf("%s",buf);
::closesocket(s);
::WSACleanup();
system("pause");

}

是基于王艳平给的写的,但是却不能连接,很奇怪
------解决思路----------------------
端口不一样,server : 4567 / client: 75
------解决思路----------------------
引用:
调试最好使用WSAGetLastError寻找错误,这样可以更直白地发现错误,而不是通过肉眼去分辨

在出错的地方调用该函数,然后根据错误提示,回溯可能出错的代码