#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
int main()
{
WORD version(0);
WSADATA wsadata;
int socket_return(0);
version = MAKEWORD(2,0);
socket_return = WSAStartup(version,&wsadata);
if (socket_return != 0)
{
return 0;
}
SOCKET server_sock = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN server_addr;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5204);
int len = sizeof(SOCKADDR);
socket_return = bind(server_sock, (SOCKADDR*)&server_addr, len);
listen(server_sock, 5);
std::cout<<"--------------------------服务器已开启----------------------------"<<std::endl;
SOCKET cilent_sock;
SOCKADDR_IN cilent_addr; 
while(1)
{
cilent_sock = accept(server_sock, (SOCKADDR*)&cilent_addr, &len);
socket_return = WSAGetLastError();
if (socket_return != 0)
{
std::cout<<"连接错误,错误代码为:"<<socket_return<<"\n按任意键退出"<<std::endl;
getchar();
return 0;
}
if ( (cilent_sock != NULL) && (cilent_sock != -1) )
{
char send_buff[50] ={0};
ZeroMemory(send_buff, 50);
sprintf_s(send_buff, "连接成功\n");
send(cilent_sock, send_buff, strlen(send_buff)+1, 0);
  while(1)
  {
char recv_buff[50];
ZeroMemory(recv_buff, 50);
len = recv(cilent_sock,recv_buff, 50, 0);
if (len == -1)
{
std::cout<<"客户端已断开"<<std::endl;
closesocket(cilent_sock);
break;
}
std::cout<<"客户端:"<<recv_buff<<std::endl;
sprintf_s(send_buff, "发送成功");
send(cilent_sock, send_buff, strlen(send_buff)+1, 0);
}
}
}
return 1;
}
上面这段是服务器的代码, 第一次启动客户端可以正常连接并且通信. 但当我把客户端关闭,再次打开的时候,accept就不能正常工作了,提示错误为10014! 

解决方案 »

  1.   

    怎样关闭的?没看见closesocket
      

  2.   

    while(1)
    {
        len = sizeof(SOCKADDR_IN);
        cilent_sock = accept(server_sock, (SOCKADDR*)&cilent_addr, &len);
        ...
    }
      

  3.   

    你的cilent_sock已经断开了,再发送肯定出现错误啊!//........
    if (len == -1)                
    {                    
       std::cout<<"客户端已断开"<<std::endl;                   
       closesocket(cilent_sock);  
       cilent_sock = NULL;//加一句在这里                  
       break;                
    }要么把SOCKET cilent_sock;    SOCKADDR_IN cilent_addr; 搞成第一层WHILE的局部变量!
      

  4.   

    问题已经解决了,到不是你说的这个原因! cilent_sock断开了, 但是我在外层循环又开始accept新的连接.并没有在发送消息, 而是等到有了新的连接,才继续发消息!