Sockets C en java

Status
Niet open voor verdere reacties.

kroepoek85

Gebruiker
Lid geworden
13 apr 2009
Berichten
10
Ik ben een applicatie aan het maken met C en Java
C is de server en java is de client.

Nu wil ik vanuit java een bericht sturen naar C om dan een actie te doen.

Dit is een deel uit mijn c server
char msgBuffer[1024];
int bufsize = 255;
........
char data = read(commSocket,msgBuffer,bufsize,0);

Dit is een deel uit mijn java programma:

PrintWriter out = new PrintWriter(socket1.getOutputStream(), true);
int outputLine = 1;
out.println(outputLine);

Wanneer ik dit ga uitvoeren krijg ik een foutmelding van cygwin\sh.exe

Error while dumping state (Probably corrupted stack)

Ik zag op internet dat er veel functies zijn met read alleen ik weet niet welke van toepassing is.
 
Hier meer info. Er staat info in over read(), maar het is aan te raden om alles te lezen omdat het gewoon een ontzettend goede tutorial voor netwerkprogrammeren is.:thumb:
 
Dit is een deel uit mijn c server
char msgBuffer[1024];
int bufsize = 255;
........
char data = read(commSocket,msgBuffer,bufsize,0);

Ik zag op internet dat er veel functies zijn met read alleen ik weet niet welke van toepassing is.

Onderaan een stukje uit linux manual page, lees dat best eerst.

char msgBuffer[1024] altijd oppassen dat je je buffer niet kan overflowen (meer dan 1024 characters in proberen steken)
int bufsize = 255 ? waarom dan 1024 bytes voor de buffer?

beter dus:
int piece_read;
piece_read = read(commSocket,msgBuffer,1024-bufsize);
en dan bufsize = bufsize + piece_read;

Wat gelezen werd staat in msgBuffer, hoeveel je gelezen hebt in piece_read.
Best ook maximum 1024-bufsize laten lezen; dan kan je dus je buffer niet overflowen.

Meeste sockets zijn streaming, het is dus mogelijk dat je niet alles in één keer te lezen krijgt, dan moet je read nogmaals aanroepen, (en nogmaals en ...)

Gebruik dus delimiters (vb: xml), of vast bepaalde groottes van je berichten. Of best, laat je bericht beginnen met hoe groot het bericht is. Op deze manier kan je eerst wachten tot het hele boeltje is binnengehaald en daarna pas het proberen te interpreteren.

(Over LAN of goede connecties, zeker als de berichten zelf niet groot zijn, zal je bijna nooit meer dan 1 keer moeten lezen)

"""
NAME
read - read from a file descriptor

SYNOPSIS
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

DESCRIPTION
read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

If count is zero, read() returns zero and has no other results. If count is greater than SSIZE_MAX, the result is unspecified.

RETURN VALUE
On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this number. It is not an error if
this number is smaller than the number of bytes requested; this may happen for example because fewer bytes are actually available right now (maybe because
we were close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was interrupted by a signal. On error, -1 is
returned, and errno is set appropriately. In this case it is left unspecified whether the file position (if any) changes.
"""
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan