关于socket编程的Select模型,该如何解决
关于socket编程的Select模型
今天写了个最简单的select模型,但是却不能连接,
麻烦大大们赏脸看下
下面是客户端:
是基于王艳平给的写的,但是却不能连接,很奇怪
------解决思路----------------------
端口不一样,server : 4567 / client: 75
------解决思路----------------------
在出错的地方调用该函数,然后根据错误提示,回溯可能出错的代码
今天写了个最简单的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
------解决思路----------------------
在出错的地方调用该函数,然后根据错误提示,回溯可能出错的代码