初学winsock编程,想练习一下发送和接受的编写,以下是服务端和客户端的两段代码,运行时客户端正常,但服务端的recv()总是返回-1,收不到发来的信息,"include <winsock.h>"和AfxSocketInit()没忘加入,请大家帮忙分析一下错在哪里?
服务器端:
WSADATA wsd;
char buffer[255];
CString str;
int xx,IpPort;
SOCKET socketListen,sClient;
struct sockaddr_in LocalAddr,ClientAddr;
IpPort=5051;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
AfxMessageBox("启动socket.dll出错");
return ;
}
socketListen=socket(AF_INET,SOCK_STREAM,0);//IPPORO_IP);
if(socketListen==SOCKET_ERROR)
{
str.Format("%d",GetLastError());
AfxMessageBox("socket wrong is" + str);
return ;
}
LocalAddr.sin_addr.s_addr=inet_addr(GetMyIP());//GetMyIP()是取得本机IP地址
LocalAddr.sin_port=htons(IpPort);
LocalAddr.sin_family=AF_INET;
if(bind(socketListen,(struct sockaddr *)&LocalAddr,sizeof(LocalAddr))==SOCKET_ERROR)
{
str.Format("%d",GetLastError());
AfxMessageBox("bind wrong is" + str);
return ;
}
listen(socketListen,2);
xx=sizeof(ClientAddr);
sClient=accept(socketListen,(struct sockaddr *) &ClientAddr,&xx);
if(sClient==INVALID_SOCKET)
{
str.Format("%d",GetLastError());
AfxMessageBox("accept wrong is" + str);
return ;
}
xx=recv(sClient,buffer,33,0);//这里总是返回-1?
if(xx=SOCKET_ERROR)
{
str.Format("recv return %d",xx);
AfxMessageBox(str);
return ;
}
AfxMessageBox(buffer);
shutdown(socketListen,2);
closesocket(socketListen);
WSACleanup();
客户端:
CString str;
int xx;
WSADATA wsd;
SOCKET sockSend;
SOCKADDR_IN addrServer;
char * szMessage="hello! the information come from ";
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
AfxMessageBox("启动socket.dll出错");
return ;
} sockSend=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.s_addr=inet_addr(m_strIP);
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons( 5051);
if(connect(sockSend,(struct sockaddr *)&addrServer,sizeof(addrServer))==SOCKET_ERROR)
{
str.Format("%d",GetLastError());
AfxMessageBox("connect wrong is" + str);
return ;
} xx=send(sockSend,szMessage,strlen(szMessage),0);
if(xx==SOCKET_ERROR)
{
str.Format("%d",GetLastError());
AfxMessageBox("send wrong is" + str);
return ;
}
shutdown(sockSend,2);
closesocket(sockSend);
WSACleanup();

解决方案 »

  1.   

    是不是阻塞连接阿?如果是非阻塞连接的,当你recv的时候就返回了,不等待
      

  2.   

    应该是阻塞连接吧,因为我把服务端放在主线程中,直到有信息传来时,该进程才响应其他消息,否则始终等待。其实在accept之后,在ClientAddr(accept的参数)地址中,已经看到客户端的IP地址,可recv时就返回-1。
      

  3.   

    xx=recv(sClient,buffer,33,0);//这里总是返回-1?
                           255
      

  4.   

    在主线程中调用SOCKET函数的话,如果客户端没有连接或发送数据的话,服务端就一直会阻塞下去,不能再响应除SOCKET外的消息,我估计你的程序是非阻塞的,如果你的Recv函数返回-1后调用GetLastError()返回的值是WSAEWOULDBLOCK的话说明你的程序是非阻塞式的。在非阻塞方式下,你可以使用SELECT(),或使用多线程
      

  5.   

    可以在 onreceive中用recieve 函数收取接收字符,另外可用csocket的成员函数create创建端口试试