- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试用 C 编写一个带有多线程支持的小型 tcp 回显服务器和一个用 java 编写的客户端,两者都使用套接字进行通信。通信开始时很好,但在尝试几次(添加新行字符或发送的旧消息片段)后,服务器和客户端之间传递的字符串不知何故开始“损坏”。我搜索了论坛并认为问题是 C 的空字符,但在 java 中删除它根本没有区别。这是 C 服务器的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <linux/limits.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <time.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
struct message {
int operacion;
int dato;
};
int max_attempts;
int obtenerMaxAttempts() {
FILE *fp;
fp = fopen("server.conf", "r");
if (fp == NULL) {
perror("Error abriendo fichero");
printf("Errno:%d", errno);
}
char line[LINE_MAX];
char *aux;
while (fgets(line, LINE_MAX, fp) != NULL) {
aux = strtok(line, " ");
if (strcmp(aux, "maxAttempts") == 0) {
aux = strtok(NULL, " ");
max_attempts = atoi(aux);
}
}
return (max_attempts);
}
int obtenerPuerto() {
in_port_t puerto;
FILE *fp;
fp = fopen("server.conf", "r");
if (fp == NULL) {
perror("Error abriendo fichero");
printf("Errno:%d", errno);
}
char line[LINE_MAX];
char *aux;
while (fgets(line, LINE_MAX, fp) != NULL) {
aux = strtok(line, " ");
if (strcmp(aux, "port") == 0) {
aux = strtok(NULL, " ");
puerto = atoi(aux);
}
}
return (puerto);
}
void *eco(void *new_sockfd) {
int socket = *((int *) new_sockfd);
free(new_sockfd);
int longitud;
char *mensaje_recv, *mensaje_env;
mensaje_recv = malloc(100 * sizeof (char));
mensaje_env=malloc(100 * sizeof (char));
while (1) {
longitud = recv(socket, (void *) mensaje_recv, 100, 0);
printf("Mensaje recibido del cliente: %s", mensaje_recv);
strcpy(mensaje_env,mensaje_recv);
printf("Mensaje enviado al cliente: %s", mensaje_env);
send(socket, (void *) mensaje_env, sizeof (mensaje_env), 0);
/* Cerrar el socket */
}
}
/* Función principal del servidor */
int main(int argc, char *argv[]) {
pthread_t idHilo;
int error;
struct sockaddr_in entrada;
entrada.sin_family = AF_INET;
entrada.sin_addr.s_addr = htonl(INADDR_ANY);
entrada.sin_port = htons(obtenerPuerto());
/* Comprueba que servidorTCP tiene 1 argumento (servidorTCP)*/
if (argc != 1) {
printf("Número de parámetros inválido.\n Sintaxis: servidorTCP \n");
exit(EXIT_FAILURE);
}
/* Creación del socket TCP */
int socketid = socket(AF_INET, SOCK_STREAM, 0); // SOCK_STREAM(conexión tcp, mirar documentación de socket())
if (socketid == -1) {
perror("Error creando el socket");
printf("Errno=%d\n", errno);
exit(EXIT_FAILURE);
}
/************************************************************************************/
/* Preparar un nombre local en el puerto especificado: El nombre local
*/
/* se prepara con la propia dirección de Internet que la sabe el sistema,
*/
/* y el puerto se obtiene del parámetro recibido
*/
/************************************************************************************/
/* Asigna nombre local al socket: Asignación de una dirección local
*/
if (bind(socketid, (struct sockaddr*) &entrada, sizeof (entrada)) == -1) {
perror("Error asignando nombre de socket");
printf("Errno=%d\n", errno);
exit(EXIT_FAILURE);
}
int new_sockfd;
#define max_queue 10
/* Esperar el establecimiento de alguna conexión */
if (listen(socketid, max_queue) == -1) {
perror("Error habilitando socket para conexiones");
printf("Errno=%d\n", errno);
exit(EXIT_FAILURE);
}
struct sockaddr_in remote_addr;
int addrlen;
addrlen = sizeof (struct sockaddr_in);
while (1) {
new_sockfd = accept(socketid, (struct sockaddr *) &remote_addr, &addrlen);
if (new_sockfd == -1) {
perror("Error aceptando la conexión");
printf("Errno=%d\n", errno);
exit(EXIT_FAILURE);
}
int *numero = malloc(sizeof (int));
*numero = new_sockfd;
//error = pthread_create(&idHilo, NULL, juego, (void *) numero);
error = pthread_create(&idHilo, NULL, eco, (void *) numero);
if (error != 0) {
perror("No puedo crear thread");
exit(EXIT_FAILURE);
}
}
/* Recibir el mensaje */
}
这里是 java 客户端的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
/**
*
* @author obok
*/
public class clienteTCP {
public static void main(String[] args) throws IOException {
/**
* Comprobamos el número de parámetros
*
*/
System.out.println(args);
System.out.println(args.length);
if (args.length != 2) {
System.out.println("Número de parámetros inválido");
System.out.println("Sintaxis: clienteTCP <dirección> <puerto>");
return;
}
int puerto;
puerto = Integer.parseInt(args[1]);
InetAddress direccion = null;
try {
direccion = InetAddress.getByName(args[0]);
} catch (UnknownHostException ex) {
//Logger.getLogger(clienteTCP.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("La dirección no es correcta.");
}
Socket socket = null;
System.out.println("Dirección:" + direccion + " Puerto: " + puerto);
try {
socket = new Socket(direccion, puerto);
} catch (IOException ex) {
System.out.println("Error de entrada salida creando el socket.");
return;
//Logger.getLogger(clienteTCP.class.getName()).log(Level.SEVERE, null, ex);
}
BufferedReader in;
String mensaje;
mensaje = "";
String mensaje2;
in = new BufferedReader(new InputStreamReader(System.in));
//DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
PrintWriter outToServer = new PrintWriter(socket.getOutputStream(),true);
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (!mensaje.equalsIgnoreCase("salir")) {
System.out.println("Introduzca mensaje: ");
mensaje = in.readLine();
System.out.println("Mensaje enviado al servidor: "+mensaje);
outToServer.println(mensaje);
//outToServer.writeBytes(mensaje+"\n");
mensaje2 = inFromServer.readLine();
mensaje2= mensaje2.replaceAll("/0", "");
System.out.println("Mensaje recibido del servidor: "+ mensaje2);
}
socket.close();
}
我还尝试调试服务器(使用 gdb)和客户端(使用 netbeans 集成 java 调试器),但我无法弄清楚它们之间出了什么问题。非常感谢任何帮助。
最佳答案
在 C 代码中,函数 eco,您不初始化使用 malloc 分配的接收缓冲区,并且在接收下一条消息之前也不重新初始化缓冲区。在阅读每条消息之前,您应该用零覆盖缓冲区。
关于java - 通信 c 服务器和 java 客户端时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16262998/
谁能解释一下 Server.MapPath(".")、Server.MapPath("~")、Server.MapPath(@"之间的区别\") 和 Server.MapPath("/")? 最佳答案
我不知道,为什么我们要使用 Server.UrlEncode() & Server.UrlDecode()?!在 QueryString 中我们看到 URL 中的任何内容,那么为什么我们要对它们进行编
我已经通过 WHM 在我的一个域上安装了 ssl 证书。网站正在使用 https://xyz.com . 但是它不适用于 https://www.xyz.com .我已经检查了证书,它也适用于 www
我已经使用 WMI 检测操作系统上是否存在防病毒软件,itz 正常工作并通过使用命名空间向我显示防病毒信息,例如 win xp 和 window7 上的名称和实例 ID:\root\SecurityC
我们有 hive 0.10 版本,我们想知道是否应该使用 Hive Server 1 或 Hive Server2。另一个问题是连接到在端口 10000 上运行的 Hive 服务器,使用 3rd 方工
我想在 C++ 中使用 Windows Server API 设置一个 HTTPS 服务器,我使用了示例代码,它在 HTTP 上工作正常,但我就是不能让它在 HTTPS 上工作。 (我不想要客户端 S
我写了一个非常基本的类来发送电子邮件。我用 smtp 服务器对其进行了测试,它工作正常,但是当我尝试使用我公司的交换服务器时,它给出了这个异常: SMTP 服务器需要安全连接或客户端未通过身份验证。服
我的应用程序包含一个“网关”DataSnap REST 服务器,它是所有客户端的第一个访问点。根据客户端在请求中传递的用户名(基本身份验证),请求需要重定向到另一个 DataSnap 服务器。我的问题
我有一个 Tomcat 服务器和一个 Glassfish4 服务器。我的 Servlet 在 Tomcat 服务器上启动得很好,但在 Glassfish4 服务器上给我一个“HTTP Status 4
我在 vmware 上创建了一个 ubuntu 服务器。我用它作为文件服务器。如果我通过托管虚拟机的计算机进行连接,则可以访问它。我无法从同一网络上的其他计算机执行此操作。提前致谢! 最佳答案 首先确
如何重启 Rails 服务器?我从 开始 rails server -d 所以服务器是分离的 我知道的唯一方法就是去做ps 辅助 | grep rails 并 kill -9关于过程#但是像这样杀死进
我实际上正在尝试找到编写一个简单的 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的服务器。我只关心XMPP的核心功能(状态、消息传递、群组消息传递)。目前还在学习 XMPP 协议(proto
我实际上正在尝试找到编写简单 XMPP 服务器的最佳方法,或者找到一个占用空间非常小的方法。我只关心 XMPP 的核心功能(统计、消息、组消息)。目前也在学习 XMPP 协议(protocol),所以
我们正在尝试从 Java JAX-RS 适配器访问 SOAP 1.1 Web 服务。 我们正在使用从 WSDL 生成的 SOAP 客户端。 但是当解码 SOAP 故障时,我们得到以下异常: ... C
目前,我和许多其他人正在多个平台(Windows、OS X 和可能的 Linux)上使用 Python HTTP 服务器。我们正在使用 Python HTTP 服务器来测试 JavaScript 游戏
我有一个连续运行的服务器程序(C#/.NET 2.0 on Linux with mono),我想从 PHP 脚本连接到它以在网站上显示状态信息。 目的是创建一个(某种)实时浏览器游戏(无 Flash
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
我们刚刚将测试 Web 服务器从 Server 2008 升级到 Server 2012 R2。我们有一个部署我们网站的批处理脚本。当它将站点推送到服务器时,它现在失败了。奇怪的是,我可以使用相同的发
建议一些加载SpagoBI服务器的方法,我尝试了所有方法来解析spagobi服务器。在 Catalina 中,错误是 - * SEVERE: Unable to process Jar entry [
当我们点击应用程序服务器(apache tomcat)时,它会创建一个线程来处理我们的请求并与 tomcat 连接,建立连接,tomcat 创建另一个线程来处理请求并将其传递给连接,连接线程将其传递给
我是一名优秀的程序员,十分优秀!