各位大虾,我是网络编程的新手,刚开始调试一个Winsock程序,要求是客户端连接到服务端后向服务端发送一条消息,服务端接收后打印出来。问题:客户端成功连接服务端,但服务端接收不到客户端发送的messag。请各位大虾指教:程序如下:服务端:
int nRetCode = 0; cout<<"Program Begin."<<endl;
cout<<"Waiting Client..."<<endl;
WSADATA wsaData;
SOCKET Server;
SOCKET Client; SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr; int port=5150; //初始化Winsock2.2
WSAStartup(MAKEWORD(2,2),&wsaData); //创建套接字
Server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //建立sockaddr_in结构
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(port);
ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY); bind(Server,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)); //监听客户机连接
listen(Server,2); int recv_count=1;
while(true)
{
    //记录客户端信息
    int ClientAddrLen=sizeof(ClientAddr);
    Client=accept(Server,(SOCKADDR*)&ClientAddr,&ClientAddrLen);
if(Client==INVALID_SOCKET)
{
cout<<"accept Error!"<<endl;
getchar();
return 0;
}     //会话
    char temp[5];
    //sprintf(temp,"Your IP is %s\r\n",inet_ntoa(ClientAddr.sin_addr));
     // 我们简单地等待客户端发送过来的字符串。
     cout << "Connection from " << inet_ntoa(ClientAddr.sin_addr) <<"\r\n";
int ret=recv(Server,temp,sizeof(temp),0);
if(ret==INVALID_SOCKET)
{
cout<<recv_count++<<"  receive Error!"<<endl;
continue;
}
cout<<temp<<endl<<"receive succeed."<<endl;
}
    cout<<"Program Finish."<<endl; //结束
closesocket(Client);
closesocket(Server); WSACleanup();
    
return nRetCode;客户端:
int nRetCode = 0; //初始化
WSADATA wsaData;
SOCKET Client;
SOCKADDR_IN ServerAddr;
int Port=5150; //初始化Winsock2.2版本
WSAStartup(MAKEWORD(2,2),&wsaData); //创建一个新的套接字来建立客户机连接
if((Client=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)
{
cout<<"Socket Error";
getchar();
return 0;
} //初始化必要的数据结构
ServerAddr.sin_family=AF_INET;
ServerAddr.sin_port=htons(Port);
ServerAddr.sin_addr.s_addr=inet_addr("125.216.242.224");

//用套接字Client来创建一个到服务器的连接
if(connect(Client,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr))!=0)
{
cout<<"Connect Error.";
getchar();
return 0;
} //会话
const char message[2]="a";
int ret=send(Client,message,sizeof(message),0);
if (ret==SOCKET_ERROR)
{
cout<<"Sending Error"<<endl;
return nRetCode;
}
cout<<"Message has sent. "<<endl<<"Client program has finished."<<endl;

    getchar();
return nRetCode;

解决方案 »

  1.   

    int ret=recv(Server,temp,sizeof(temp),0); 此处的socket是不是应该用accept返回的socket?
    int ret=recv(Client,temp,sizeof(temp),0); 
      

  2.   

    accept返回的socket为Client。
    这里用的是Server的Socket。应该不是这里。
      

  3.   

    你确定么?如果有多个客户端连接,你这如果用服务器的socket,怎么区分呢?
      

  4.   

    同意5楼的说法recv(Server,temp,sizeof(temp),0); 中的Server要改成accept返回的套接字
    服务器端调用listen时Server这个套接字转为被动的监听状态,用来建立连接(接收SYN),再通过调用accept来返回一个正常的套接字与客户端进行通信。我就大概说下,有些地方可能说的不对哈