【问题标题】:UDP connection between C server and Java clientC服务器和Java客户端之间的UDP连接
【发布时间】:2012-03-12 18:54:25
【问题描述】:

我还有另一个问题 :) 我有一个简单的 C UDP 服务器,它读取一些字节,对这些字节应用一些解码,当它有一个格式为 ###@####@###@# 的字符串时## 他通过 UDP 将它发送到 C 中的另一台服务器。这是我的 C 服务器的代码,称为 preprocesamiento.c 我发布整个事情 cos 更容易,但这可能与我的问题无关。

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <stdint.h>
#include <string.h>
#include <openssl/sha.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#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 <file.config adress>\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 <sys/types.h>
 #include <sys/socket.h>
 #include <netdb.h>
  #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <string.h>
#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 <file.config adress>\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(in<*maxRequests)

{

    in++;

    printf("Request number %i\n",in);





    printf("Adresss::: %d\n",udpServer.sin_addr.s_addr);

    printf("PORT:::: %i\n",udpServer.sin_port);



    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("Message sent.\n");



    /* message sent: look for confirmation */

/*

    addrlen = sizeof(udpServer);



    returnStatus = recvfrom(udpSocket, (char*) &msg, sizeof(msg), 0, 

                            (struct sockaddr*)&udpServer, &addrlen);



    if (returnStatus == -1) {

        if(*useStdrr)

        {

        fprintf(stderr, "Did not receive confirmation!\n");

        }

    }





    else {



        printf("Second: %s\n", msg);





        */

        in=*maxRequests;

        boolv=1;

        /*







    }*/



  }

}

if(!boolv)

{

    if(*useStdrr)

    {

    fprintf(stderr, "fixed number of requests finished.. no reply.\n");

    }

}





 close(udpSocket);

 return 0;



 }



 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, 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;

    }

    printf("Atribute: %s\n",atribute);

    printf("Value: %s\n",value);

    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=atoi(value);

    }

    else if(!strcmp(atribute,"request_*timeOut"))

    {

        *timeOut=atoi(value);

    }


}



}

 }

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

非常感谢!!!

亚历杭德罗·卡萨斯

【问题讨论】:

  • 如果 Java 服务器通过网络堆栈发送 UDP,那么您应该能够使用以任何语言编写的 UDP 客户端来接收该数据。您是否使用过诸如 wireshark 之类的工具来验证数据包是否从 Java 服务器发出?
  • @Alejandro,如果您不打算花时间清理源代码,那么很难指望其他用户会花宝贵的时间免费帮助您...

标签: java c++ c udp client-server


【解决方案1】:

没有 UDP 连接这样的东西。在 UDP 中,程序只是在给定 IP 的给定端口发送数据包。如果在该 IP/端口没有监听,或者接收程序决定忽略 UDP 数据包,它就会被丢弃。如果你想要一个实际的连接,你会使用 TCP。

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

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

不过,我还没有用 C 语言进行过套接字编程。

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

【讨论】:

    【解决方案2】:

    这是关于如何开始开发 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/

    【讨论】:

      猜你喜欢
      • 2016-02-16
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2022-01-24
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多