Intereting Posts
GTK + gcc: неопределенная ссылка на все функции gtk при связывании Эта программа имеет какие-либо проблемы с точки зрения последовательности? API Win32 C для перенаправления минимизации анимации Распечатки перед execl не отображаются на выходе в каких случаях мне нужно блокировать переменную от одновременного доступа? multi file C, как лучше всего реализовать дополнительный журнал? Когда требуется сокращение? Сортировка строк в статическом массиве в зависимости от их длины? | неправильное распределение / доступ | Указатели разыменования, не указывая их на переменную Какой тип следует использовать для двоичного представления C enum? Сделать пусковую установку C на моем Mac Почему «отличное от« X * »до« Y »теряет точность» жесткая ошибка и то, что подходит для устаревшего кода Назначить несколько значений массиву в C Вручную сортировать связанный список на языке программирования C C – Lstat on / proc / pid / exe

Соединение UDP между сервером C и клиентом Java

У меня есть другой вопрос 🙂 У меня есть простой UDP-сервер в C, который читает несколько байтов, применяет некоторые декодирование к этим байтам и когда у него есть STRING формы ### @ #### @ ### @ ### he отправляет его через UDP на другой сервер в C. Вот код для моего C-сервера, который называется preprocesamiento.c. Я отправляю все, потому что это проще, но, возможно, это не имеет ничего общего с моей проблемой.

#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-банку, которая отправляет данные, поскольку мой сервер хочет ее через 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); } } } } в  #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); } } } } -  #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. Убедитесь, что вы отправляете с DatagramSocket на своем Java-клиенте.

Однако я не программировал сокет в C.

Наконец, это поможет, если вы разместите часть своего Java-кода.

Это отличный пример того, как начать разработку клиента / сервера Java. Обратите внимание, что это происходит из «Компьютерной сети: подход сверху вниз», автор Kurose и Ross. В книге есть примеры UDP / TCP в JAVA , которые являются отличными, и я рекомендую вам.

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/