C服务器和Java客户端之间的UDP连接

我有另一个问题:)我在C中有一个简单的UDP服务器读取一些字节对这些字节应用一些解码,当它有一个forms的字符串### @ #### @ ### @ ### he通过UDP将它发送到C中的另一个服务器。这是我的C服务器的代码,称为preprocesamiento.c我发布整个事情cos是easyer但也许这与我的问题无关。

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #define MAXBUF 512 #define SENDING 0x52 #define RESIVING 0xB4 #define TYPE 0xA3F0 int createSocket(); char *unbase64(unsigned char *input, int length); /* This function recives bytes(ASCII numbers) and returns the char */ void cambiarAChars(char* bytes, char* result) { unsigned int ch; char a[4]; char buff[50]; strcpy(result,""); int i=0; while(i<strlen(bytes)) { if(bytes[i]=='1') { a[0]=bytes[i]; a[1]=bytes[i+1]; a[2]=bytes[i+2]; a[3]='\0'; i=i+3; } else { a[0]=bytes[i]; a[1]=bytes[i+1]; a[2]='\0'; i=i+2; } ch = atoi(a); sprintf(buff,"%c",ch); strcat(result,buff); } } /*this is the message that is going to be sent to the other server*/ char msg[MAXBUF]; /*this is the bytes recived*/ char bytes[MAXBUF]; void loadConfig(struct sockaddr_in *udpServer,struct sockaddr_in *thisServer,unsigned char *file); int sendDataToServerXX(struct sockaddr_in *udpServer, int udpSocket); int *useStdrr; int *maxRequests; int returnStatus; int main(int argc, char* argv[]) { if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } useStdrr=malloc(sizeof(int)); maxRequests=malloc(sizeof(int)); struct sockaddr_in udpServer,thisServer,udpClient; loadConfig(&udpServer,&thisServer, argv[1]); int thisServerSocket = createSocket(); int udpSocket=createSocket(); int addrlen; printf("Listening on.. %d \n",thisServer.sin_port); thisServer.sin_family = AF_INET; returnStatus = bind(thisServerSocket, (struct sockaddr*)&thisServer, sizeof(thisServer)); if (returnStatus == 0) { fprintf(stderr, "Bind completed!\n"); } else { fprintf(stderr, "Could not bind to address \n" ); close(thisServerSocket); exit(1); } /*En este while infinito estamos esperando los datos de las tramas*/ while (1) { addrlen = sizeof(udpClient); /* How to resive a struct? */ returnStatus = recvfrom(thisServerSocket,(char*)&bytes, sizeof(bytes), 0, (struct sockaddr*)&udpClient, &addrlen); if (returnStatus == -1) { fprintf(stderr, "Could not receive message!\n"); } else { printf("Lo que llego: %s \n",bytes); /*Primero quitamos el 0 y 1 y guardamos el nuevo arreglo en p*/ bytes[strlen(bytes)-1]='\0'; char p[strlen(bytes)]; int i=0; while(bytes[i+1]!='\0'){ p[i]=bytes[i+1]; i++; } /*esto simula la cambiada a base10 de base64*/ char *result=malloc(512); char *p2=malloc(sizeof(p)+1); strcpy(p2,p); cambiarAChars(p2,result); strcat(result,"\n\0"); printf("TAMANO: %d \n",strlen(result)); char *output = unbase64(result, strlen(result)); printf("Unbase64: %s\n", output); msg[0]='%'; strcat(msg,output); int f=strlen(msg); msg[f]='%'; msg[f+1]='\0'; printf("Voy a mandar: %s \n",msg); sendDataToServerXX(&udpServer,udpSocket); free(output); } } close(thisServerSocket); close(udpSocket); } int createSocket() { /* create a socket */ int Socket; Socket = socket(AF_INET, SOCK_DGRAM, 0); if (Socket == -1) { if(*useStdrr) { fprintf(stderr, "Could not create a socket!\n"); } exit(1); } else { printf("Socket created.\n"); } return Socket; } void loadConfig(struct sockaddr_in *udpServer,struct sockaddr_in *thisServer, unsigned char *file) { char line[256]; int linenum=0; FILE* f = fopen(file, "r"); while(fgets(line, 256, f) != NULL) { char atribute[256], value[256]; linenum++; if(line[0] == '#'||line[0] == ' ') { continue; } else{ if(sscanf(line, "%s %s", atribute, value) != 2) { fprintf(stderr, "Syntax error, line %d\n", linenum); continue; } if(!strcmp(atribute,"server_address" )) { if(!strcmp(value,"")) { udpServer->sin_addr.s_addr = htonl(INADDR_ANY); } else{ udpServer->sin_addr.s_addr = inet_addr(value); } } else if(!strcmp(atribute,"server_port")) { udpServer->sin_port = htons(atoi(value)); } else if(!strcmp(atribute,"print_message_details")) { if(!strcmp(value,"ON")) { *useStdrr=1; } else { *useStdrr=0; } } else if(!strcmp(atribute,"request_count")) { *maxRequests=5; } else if(!strcmp(atribute,"valor_que_viene_del_cohete_simulado")) { } else if(!strcmp(atribute,"this_server_address")) { if(!strcmp(value,"")) { thisServer->sin_addr.s_addr = htonl(INADDR_ANY); } else{ thisServer->sin_addr.s_addr = inet_addr(value); } } else if(!strcmp(atribute,"this_server_port")) { thisServer->sin_port = htons(atoi(value)); } } } } int sendDataToServerXX(struct sockaddr_in *udpServer, int udpSocket) { udpServer->sin_family = AF_INET; int in=0; int boolv=0; while(in<*maxRequests) { in++; returnStatus = sendto(udpSocket,(char*) &msg, sizeof(msg), 0, (struct sockaddr*)udpServer, sizeof(*udpServer)); if (returnStatus == -1) { if(*useStdrr) { fprintf(stderr, "Could not send message!\n"); } } else { printf("Datos enviados al servidor xx.\n"); memset(msg, 0, strlen(msg)); in=*maxRequests; boolv=1; } } if(!boolv) { if(*useStdrr) { fprintf(stderr, "fixed number of requests finished.. no reply.\n"); } } return 0; } char *unbase64(unsigned char *input, int length) { BIO *b64, *bmem; char *buffer = (char *)malloc(length); memset(buffer, 0, length); b64 = BIO_new(BIO_f_base64()); BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); bmem = BIO_new_mem_buf(input, length); bmem = BIO_push(b64, bmem); BIO_read(bmem, buffer, length); BIO_free_all(bmem); return buffer; } 

好吧,我做了一个模拟器,将数据发送到这个服务器…基本上是一个UDP客户端,发送我想要的字节。 连接和整个事情非常好:)。 现在我试图连接到真正的测试人员,这是一个java jar,它发送数据,因为我的服务器想通过UDP。 唯一的问题是我没有java源代码,因为它不是我的…但程序似乎运行顺利(java jar)但是当我检查我的服务器没有连接的地方。 是的,我正在等待正确的端口和两个程序C和Java在同一台机器(UBUNTU)运行。

我发布了我用C制作的客户端模拟器,这个服务器非常好用。

对不起,我从配置文件加载有点长:

  #include  #include  #include  #include  #include  #include  #include  #include  #define MAXBUF 1024 #define SENDING 0x52 #define RESIVING 0xB4 #define TYPE 0xA3F0 int createSocket(); char msg[MAXBUF]; void loadConfig(struct sockaddr_in *udpServer, char *file); int *useStdrr; int *maxRequests; int *timeOut; int main(int argc, char* argv[]) { int returnStatus; int addrlen; struct sockaddr_in udpClient, udpServer; char buf[MAXBUF]; useStdrr=malloc(sizeof(int)); maxRequests=malloc(sizeof(int)); timeOut=malloc(sizeof(int)); /*ms.timezone="AES";*/ if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } int udpSocket=createSocket(); udpServer.sin_family = AF_INET; loadConfig(&udpServer, argv[1]); /*how to send a struct here?*/ int in=0; int boolv=0; printf("Request number %i\n",*maxRequests); while(insin_addr.s_addr = htonl(INADDR_ANY); } else{ udpServer->sin_addr.s_addr = inet_addr(value); } } else if(!strcmp(atribute,"server_port")) { udpServer->sin_port = htons(atoi(value)); } else if(!strcmp(atribute,"print_message_details")) { if(!strcmp(value,"ON")) { *useStdrr=1; } else { *useStdrr=0; } } else if(!strcmp(atribute,"request_count")) { *maxRequests=atoi(value); } else if(!strcmp(atribute,"request_*timeOut")) { *timeOut=atoi(value); } } } } 

现在真正的问题:我是否必须做一些不同的事情来连接从Java客户端到C服务器的C,而不是我连接到另一个C客户端的连接? 如果答案是否则问题出现在java项目中? 他们告诉我它的工作正常,但我认为他们已经用JAVA服务器进行了测试..有什么不同之处吗? 如果问题出现在java项目中,我应该告诉他们如何更改它以使用我的C服务器?

很多thx !!!

亚历杭德罗卡萨斯

没有UDP连接这样的东西。 在UDP中,程序只是在给定IP的给定端口处抛出数据包。 如果没有侦听该IP /端口,或者接收程序决定忽略UDP数据包,则会被丢弃。 如果您想要实际连接,则可以使用TCP。

另外,某些ISP默认阻止某些类型的UDP数据包

在Java中,TCP套接字称为Socket,UDP套接字称为DatagramSocket。 确保从Java客户端上的DatagramSocket发送。

我没有在C中完成套接字编程。

最后,如果您发布了一些Java代码,它会有所帮助。

这是如何开始开发Java客户端/服务器的一个很好的例子。 请注意它来自Kurose和Ross的“计算机网络:自上而下的方法”这本书在JAVA中有两个UDP / TCP示例,这很好,我推荐你。

UDP服务器/客户端: http : //systembash.com/content/a-simple-java-udp-server-and-udp-client/

TCP服务器/客户端: http : //systembash.com/content/a-simple-java-tcp-server-and-tcp-client/