TCP-Verbindung C -> VB.Net

    TCP-Verbindung C -> VB.Net

    Hi,
    Ich habe einen TCP-Server mit C geschrieben. Der läuft auf einem Debian-System.
    Als Client habe ich ein VB.Net-Programm.

    Ich kann mit dem Client zum Server connecten und auch Daten senden.
    Jedoch kann ich die Daten die vom Server kommen nicht auslesen.

    Hier die Codes:

    Server: (C)
    Spoiler anzeigen

    C-Quellcode

    1. #include <unistd.h>
    2. #include <stdlib.h>
    3. #include <stdio.h>
    4. #include <sys/socket.h>
    5. #include <netinet/in.h>
    6. #include <strings.h>
    7. #include <string.h>
    8. #include <arpa/inet.h>
    9. #include <pthread.h>
    10. #include <errno.h>
    11. #define ZEILENLAENGE 10
    12. pthread_t thread_counter_get, thread_counter_set;
    13. char *ptr, *ptr_counter_get, ptr_counter_set;
    14. char buffer[20], buffer_temp[20], puffer[ZEILENLAENGE];
    15. char *ar_counter_set[1];
    16. int x, iMinuten, connected = 0, csd;
    17. FILE *quelle;
    18. void *func_counter_get (void* p) { // Der Type ist wichtig: void* als Parameter und Rückgabe
    19. if( (quelle=fopen("counter.txt","r")) == NULL) { // Versuchen Datei zu öffnen
    20. fprintf(stderr, "Kann Datei nicht oeffnen\n"); // Lesen Fehlerhaft
    21. return EXIT_FAILURE;
    22. } // Lesen Fehlerfrei
    23. fgets(puffer, ZEILENLAENGE, quelle);
    24. fclose(quelle);
    25. iMinuten=puffer;
    26. printf("counter=%s\n",iMinuten);
    27. /*return EXIT_SUCCESS;
    28. */
    29. //return NULL; // oder in C++: return 0;// Damit kann man Werte zurückgeben
    30. }
    31. void *func_counter_set (void* p) { // Der Type ist wichtig: void* als Parameter und Rückgabe
    32. printf("test1234\n");
    33. /*
    34. x = 0;
    35. ptr_counter_set = strtok(buffer_temp, ";"); // buffer_temp bei ; trennen und in ptr schreiben
    36. while(ptr_counter_set != NULL) {
    37. ar_counter_set[x]=ptr_counter_set;
    38. //printf("Hier: %s\n",ueberschuss_counter_get[x]);
    39. x++;
    40. ptr_counter_set = strtok(NULL, ";"); // naechsten Abschnitt erstellen
    41. }
    42. return NULL; // oder in C++: return 0;// Damit kann man Werte zurückgeben
    43. */
    44. }
    45. void Eth_Send_Recv_Data()
    46. {
    47. //printf("punkt1\n");
    48. while(connected)
    49. {
    50. // Vom Client lesen und ausgeben
    51. memset(buffer, 0, sizeof(buffer));
    52. int bytes = recv(csd, buffer, sizeof(buffer), 0);
    53. if (bytes == 0 || bytes == -1 ){
    54. //csd=0;
    55. connected=0;
    56. printf("Client getrennt!\n");
    57. } else {
    58. //printf("Der Client hat folgenden String gesendet: %s\n", buffer);
    59. //printf("Es wurden %d Bytes empfangen\n", bytes);
    60. //Empfangene Daten verarbeiten
    61. sprintf(buffer_temp,"%s",buffer);
    62. ptr = strtok(buffer, ";"); // string bei ; trennen und in ptr schreiben
    63. //if (strcmp(ptr, "counter_get") != 0) {
    64. if (strstr(ptr, "counter_get") !=NULL ) {
    65. //printf("getcounter\n");
    66. pthread_create(&thread_counter_get, NULL, func_counter_get, NULL); // Thread aufrufen
    67. pthread_join (thread_counter_get, NULL); // Auf Threadende warten
    68. //printf("getcounter2\n-------------------\n");
    69. } else if (strstr(ptr, "counter_set") !=NULL ) {
    70. //printf("setcounter1\n");
    71. pthread_create(&thread_counter_set, NULL, func_counter_set, NULL);
    72. pthread_join (thread_counter_set, NULL);
    73. //printf("setcounter2\n-------------------\n");
    74. } else {
    75. //printf("andere\n");
    76. }
    77. }
    78. }
    79. }
    80. int main(void) {
    81. /* Server-Anfang */
    82. /* Socket erstellen - TCP, IPv4, keine Optionen */
    83. int lsd = socket(AF_INET, SOCK_STREAM, 0);
    84. /* IPv4, Port: 50125, jede IP-Adresse akzeptieren */
    85. struct sockaddr_in saddr;
    86. saddr.sin_family = AF_INET;
    87. saddr.sin_port = htons(50125);
    88. saddr.sin_addr.s_addr = htons(INADDR_ANY);
    89. /* Socket an Port binden */
    90. bind(lsd, (struct sockaddr*) &saddr, sizeof(saddr));
    91. /* Auf Socket horchen (Listen) */
    92. listen(lsd, 20);
    93. /* Puffer und Strukturen anlegen */
    94. struct sockaddr_in clientaddr;
    95. bzero(buffer, sizeof(buffer));
    96. while(1) {
    97. /* Auf Verbindung warten, bei Verbindung Connected-Socket erstellen */
    98. socklen_t clen = sizeof(clientaddr);
    99. csd = accept(lsd, (struct sockaddr*) &clientaddr, &clen);
    100. if (csd == -1) {
    101. perror("Fehler bei accept()\n" );
    102. printf("Errno Code:\t%d\n",errno);
    103. } else {
    104. connected=1;
    105. printf("Client verbunden!\n");
    106. Eth_Send_Recv_Data();
    107. }
    108. }
    109. }



    Client: (VB.Net)
    Spoiler anzeigen
    Private Sub Connect(ByVal server As String, ByVal message As String)

    VB.NET-Quellcode

    1. Try
    2. ' Create a TcpClient.
    3. ' Note, for this client to work you need to have a TcpServer
    4. ' connected to the same address as specified by the server, port
    5. ' combination.
    6. Dim port As Int32 = 50125
    7. Dim client As New TcpClient(server, port)
    8. ' Translate the passed message into ASCII and store it as a Byte array.
    9. Dim data As Byte() = System.Text.Encoding.ASCII.GetBytes(message)
    10. ' Get a client stream for reading and writing.
    11. ' Stream stream = client.GetStream();
    12. Dim stream As NetworkStream = client.GetStream()
    13. ' Send the message to the connected TcpServer.
    14. stream.Write(data, 0, data.Length)
    15. Console.WriteLine("Sent: {0}", message)
    16. ' Receive the TcpServer.response.
    17. ' Buffer to store the response bytes.
    18. data = New Byte(256) {}
    19. ' String to store the response ASCII representation.
    20. Dim responseData As String = String.Empty
    21. ' Read the first batch of the TcpServer response bytes.
    22. Dim bytes As Int32 = stream.Read(data, 0, data.Length)
    23. responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
    24. Console.WriteLine("Received: {0}", responseData)
    25. ' Close everything.
    26. stream.Close()
    27. client.Close()
    28. Catch e As ArgumentNullException
    29. Console.WriteLine("ArgumentNullException: {0}", e)
    30. Catch e As SocketException
    31. Console.WriteLine("SocketException: {0}", e)
    32. End Try
    33. Console.WriteLine(ControlChars.Cr + " Press Enter to continue...")
    34. Console.Read()
    35. End Sub 'Connect



    Nachdem ich connected habe, sende ich z.B. ein counter_get an den Server. Dieser verarbeitet das und gibt den Inhalt einer Datei aus.
    Soweit in Ordnung. Der Client läuft, bis zu Zeile 29:

    Quellcode

    1. Dim bytes As Int32 = stream.Read(data, 0, data.Length)

    Hier hängt sich das Programm dann auf, bis der Server wieder geschlossen wird.

    Hat von euch jemand eine Ahnung, woran das liegen kann?
    Sendet der Server die Daten falsch raus? Fehlt beim Client noch was?

    Viele Danke für die Hilfe...
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia