各位大虾,我是网络编程的新手,刚开始调试一个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;
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;
int ret=recv(Client,temp,sizeof(temp),0);
这里用的是Server的Socket。应该不是这里。
服务器端调用listen时Server这个套接字转为被动的监听状态,用来建立连接(接收SYN),再通过调用accept来返回一个正常的套接字与客户端进行通信。我就大概说下,有些地方可能说的不对哈