3,882
社区成员




DWORD IniSOCKDLL()
{
WORD wVersionRequested;
WSADATA wsaData;
int err=0;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if(err != 0)
return err;
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
err = -1;
}
return err;
}
int main()
{
int status;
IniSOCKDLL();
SOCKET sc=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
int len;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(21050);
len = sizeof(addr);
cout << "start client" << endl;
status = ::connect(sc, (struct sockaddr *)&addr, len);//server已开启,连接server端
char buff[1024];
ZeroMemory(buff,1024);
memcpy(buff,"linking",7);
u_long iMode = 1;//非阻塞模式
ioctlsocket(sc, FIONBIO, &iMode);//设置套接字sc为非阻塞模式
len = send(sc,buff, strlen(buff),0);
while(!quit){
len = recv(sc, buff, 1024, 0);
if(len < 0){
int err = GetLastError();//改成这个就好使; 用WSAGetLastError()就一直是0
if(err == WSAENETDOWN || err == WSAECONNRESET || err == WSAENOTCONN){//断线重连
closesocket(sc);
sc = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, NULL);
int status = ::connect(sc, (struct sockaddr *)&addr, sizeof(addr));
if(status < 0){
Sleep(3000);
}else{
memcpy(buff,"linking",7);
ioctlsocket(sc, FIONBIO, &iMode);
send(sc,buff,7,0);
}
}else if(err == WSAEWOULDBLOCK){
Sleep(10);
}
continue;
}
send(sc, "received", strlen("received"), 0);
if(strncmp(buff,"left",4) ==0){
cout << "left" << endl;
}else if(strncmp(buff,"right",5)==0){
cout << "right" << endl;
}
ZeroMemory(buff, 1024);
}//while
closesocket(sc);
cout << "stopped..." << endl;
return 0;
}