[英]Android client can't open a socket to a C server
对于这个非常具体的问题,我什么也找不到,但是也许其他人已经做到了。
我有一个用C编写的服务器程序(已删除错误检查以提高可读性):
int main(int arc, char *argv[])
{
int sockfd, newsockfd, portnum, cli_len, num_chars, n;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
// Set up the socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// Set up our variables
bzero((char *) &serv_addr, sizeof(serv_addr));
portnum = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portnum); // Convert from host port to network port
serv_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("Socket could not be bound");
listen(sockfd, 5); // Get ready to receive connections
cli_len = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &cli_len);
// Message processing
return 0;
}
同时,我有Android客户端(版本4.1.2):
private class ClientTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
try {
InetAddress a = InetAddress.getByAddress(new byte[] {(byte) 192, (byte) 168, 1, (byte) 102});
sock = new Socket(a, 65053);
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
DataOutputStream outToServer = new DataOutputStream(sock.getOutputStream());
// Message processing
} catch (UnknownHostException e) {
System.out.println("No address found for ");
} catch (IOException e) {
System.out.println("Failed to open socket");
}
return null;
}
}
我的问题是Android客户端无法打开套接字。 超时后,我总是收到“无法打开套接字”的信息。 android客户端可以与我拥有的java服务器一起使用,而我拥有的java客户端至少可以与C服务器建立连接。 我不明白这可能是错的...
如果您需要更多详细信息或其他代码,请告诉我。
您无需指定是否在同一局域网内同时运行两个设备(服务器和客户端),在这种情况下可以丢弃连接问题。 如果没有,这可能是一个测试。 如果您能够将客户端连接到同一路由器下的服务器,则意味着否则(即使用您的公共IP)存在某种阻止它的东西,可能是您的路由器。 另一个问题可能是防病毒,操作系统端口被阻止,路由器端口被阻止...
如果您无法在同一路由器连接下同时连接这两者,则绝对是代码问题。 您可能不知道罪魁祸首在哪里,我建议在客户端代码中的几条Log.d()
行和服务器代码中的printf()
语句放在双方的连接摘要中,并查看瓶颈在哪里,或使用一些调试工具并放置一些断点。
----编辑----
尝试以这种方式连接:
Socket socket;
final String host = "192.168.1.X";
final int port = 65053;
final int timeout = 30000; // 30 seconds
try {
socket = new Socket();
socket.connect(new InetSocketAddress(host, port), timeout);
}
catch (UnknownHostException uhe) {
Log.e("Sock", "I couldn't resolve the host you've provided!");
}
catch (SocketTimeoutException ste) {
Log.e("Sock", "After a reasonable amount of time, I'm not able to connect!");
}
catch (IOException ioe) {
Log.e("Sock", "Hmmm... Sudden disconnection, probably you should start again!");
}
Whelp,这是一个防火墙问题,令人尴尬。 显然,Eclipse是通过我的防火墙的,这就是Java服务器正常工作的原因,但是当我通过命令行运行C代码时,我一定错过了提示符。 我禁用了防火墙,它立即起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.