我正在尝试编写与Windows服务器通信的简单android客户端代码。我正在使用套接字来实现这一目标,直到现在,我都在使用Linux机器(android客户端和linux服务器)进行测试。到目前为止,一切正常。现在,我正在尝试在Windows(服务器)上进行设置,我当然注意到我必须稍稍更改代码(如果不只是include ^^')。无论如何,我的问题是我的recv函数返回-1,尽管它应该读取某些内容,但是由于某种原因而没有。
下面是我如何使用我的recv函数(编辑:现在是整个服务器代码):
int tcp_server::start_listening()
{
WORD wVersionRequested;
WSADATA wsaData;
int wsaerr;
wVersionRequested = MAKEWORD(2, 2);
wsaerr = WSAStartup(wVersionRequested, &wsaData);
if (wsaerr != 0)
{
printf("Server: The Winsock dll not found!\n");
WSACleanup();
return 0;
}
else
{
printf("Server: The Winsock2 dll found \n");
}
sSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sSock == INVALID_SOCKET)
{
printf("Server: Error initializing socket!n");
WSACleanup();
return 0;
}
sockaddr_in service,client ;
service.sin_family = AF_INET;
service.sin_port = htons(port);
service.sin_addr.s_addr = INADDR_ANY;
if(bind(sSock,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
{
printf("Server: Error binding socket to portn");
WSACleanup();
return 0;
}
/* wait for incoming connections */
if(listen(sSock,10)==SOCKET_ERROR)
printf("listen(): Error listening on socket %d\n", WSAGetLastError());
else
{
printf("Server: Waiting for connections...\n");
}
/* accept connections */
AcceptSocket;
printf("Server: Waiting for a client to connect...\n");
AcceptSocket = accept(sSock, NULL, NULL);
if (AcceptSocket == INVALID_SOCKET) {
wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
closesocket(sSock);
WSACleanup();
return 1;
} else {
wprintf(L"Client connected.\n");
acceptConns();
}
closesocket(sSock);
return 0;
}
int tcp_server::acceptConns()
{
sockaddr_in from;
bool infinite = true ;
int fromlen=sizeof(from);
int readsize;
char* message;
char* clientmessage = "\0";
string smatrix ;
int ind ;
string tok;
int i = 0 ;
int bytesSent ;
float matrix[16] ;
while( (readsize = recv(AcceptSocket, clientmessage, 2000, 0))!= 0 ){
message = "ack";
cout << "Writing ACK" << endl ;
smatrix = clientmessage ;
std::stringstream ss(smatrix);
cout << smatrix << endl ;
while(getline(ss, tok, ',') && i < 16 ){
matrix[i] = static_cast<float>(::atof(tok.c_str()));
i++ ;
}
i = 0 ;
Sleep(1000);
}
if(readsize == 0 ){
cerr << "client disconnected" << endl ;
}
cout << "Socket closed" << endl ;
closesocket(sSock);
WSACleanup();
}
至于我的android代码:这是:
while(closeConnection == false) {
if (connected == true && matrixupdated == true && this.hasMatrixChanged()){
try {
//= new BufferedReader(new InputStreamReader(java.lang.System.in));
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
String sentence = this.getStringFromMatrix();
outToServer.writeBytes(sentence + "\n");
outToServer.flush();
inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.arraycopy(matrix, 0, previousMatrix, 0, 16);
inFromServer.read(serverMsg);
if(serverMsg.equals("ack") == true){
this.serverHasInput = false ;
Log.e("ACK", "ACK");
inFromServer.read(serverMsg); //Wait for the "ok" message from server
if(serverMsg.equals("ok") == false){
Log.e("ERROR IN COM W/ SERV"," DID NOT RECEIVE OK");
}
}
else{
this.serverHasInput = true ;
}
//Log.d("SERVERMSG", "DONE WAITING");
}catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
this.matrixupdated = false ;
}
}
try {
outToServer.flush();
outToServer.close();
inFromServer.close();
clientSocket.close();
}
最后,不幸的是我在控制台中得到的输出
客户端断开连接
我猜这可能是一些非常愚蠢的东西,但是我一直试图在MS网站和recv的文档上看到它为什么会给我-1的信息,但我无法获得解释。
预先感谢您提供的帮助:)。
C ++类代码中有许多错误if (bytesSent = 0)
,这是将结果强制转换为布尔值的赋值,因此始终返回false
。您无需关注从TCP套接字读取的字节数,假设您在发送时收到一条完整的消息-这是错误的,因为您可能正在读取部分消息,多于一条消息或两者之间的任何消息-这是一个原始字节流。
-1
明确检查从系统调用返回的内容,然后检查的值(errno(3)
例如说strerror(3)
函数)以找出问题所在。
您正在尝试使用侦听套接字sSock
进行数据传输-错误-它仅用于接受客户端连接请求。使用时AcceptedSocket
,从中退回一个accept()
。它是与客户端的连接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句