日期:2014-05-16  浏览次数:20663 次

windows socket 双机对话
 因为学校晚上断网很早,最近看了下socket似乎直接通过IP相连接那么利用这个在只有内网的情况下也可以进行通话。查阅了一定的资料。虽然实现了双机对话。但是 是“一问一答”模式 是因为阻塞的原因 
于是修改了下。尝试用非阻塞。但是没能成功,贴出部分服务端的代码 请各位大神们支招呀~

因为第一次写这个。select函数一知半解。准备各种被嘲讽了 只求能解决问题
        printf("%s\n","服务器运行中.......");   

while (1)   
{   
//等待用户请求到来   
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
                //第一个参数为处在监听状态的套接字 第二个为返回的连接的实体的地址
                int iMode = 1; //0:阻塞   1:非阻塞
ioctlsocket(sockConn,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置
while (1)
{
timeval waitTime;
waitTime.tv_sec = 5;
int canread = -1,canwrite = -1;
fd_set sclistr;
FD_ZERO(&sclistr);
FD_SET(sockConn,&sclistr);

canread = select(0,&sclistr,0,0,&waitTime);

while (canread > 0)
{
recv(sockConn,revBuf,100,0);   
printf("收听:%s\n",revBuf);

fd_set sclistr;
FD_ZERO(&sclistr);
FD_SET(sockConn,&sclistr);

canread = select(0,&sclistr,0,0,&waitTime);

}

fd_set sclistw;
FD_ZERO(&sclistw);
FD_SET(sockConn,&sclistw);
canwrite = select(0,0,&sclistw,0,&waitTime);
if (canwrite > 0)
{
scanf("%s",sendBuf);
send(sockConn,sendBuf,100,0);
}
}

//关闭套接字   
closesocket(sockConn);   

}
是不是要用多线程的方法 如要要的话该怎么用呢?还是直接用select就能解决?select是用于多个句柄的。只有一个connect的情况下如何让它能随时显示对方发来的信息的同时又让我随时能够输入呢。弱弱的查了很多资料最后改成这幅德行了...
socket Windows select

------解决方案--------------------
不懂C,你过C++版问,很多人能答你

我只说一般socket本本知识
非阻塞要是可检查状态,异步select可以做这事
外部要做一个loop,不断检查状态,可读就进入recv直到接受完成,可写就进入send直到发送成功
每当发完、收完就要返回状态给loop
close结束loop,退出