Illegal seek bei Client-Anwendung in C

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Illegal seek bei Client-Anwendung in C

Beitrag von hawkeye78 » 15.07.2007 23:58:38

Hallo,

ich versuche mehr oder minder erfolgreich an diesem schönen sommerlich Abend auf ein LCD welches durch die Anwendung lcdproc "versorgt" wird zu schreiben.
Mit viel Hilfe von ein paar netten Mitmenschen habe ich es hinbekommen eine Verbindung zu dem Server von LCDproc aufzubauen. Nun läuft mein Programm allerdings auf einen "Illegal Seek"-Error wenn ich versuche hinter einander mehrmals Daten zu senden. Meine Überlegung bis jetzt war das er evtl. nicht schnell genug die Daten verarbeiten kannt, aber selbst ein usleep zwischendurch hat nicht wirklich Abhhilfe geschaffen. Mein Quellcode schaut im moment so aus:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>

const char* host="127.0.0.1";
const char* port="13666";
int s=-2;

// Aufbau der Verbindung
int init_conn()
{
        struct sockaddr_in srv;

        s=socket(AF_INET, SOCK_STREAM, 0);

        if(s==-1)
        {
                perror("socket failed()");
                return -1;
        }

        srv.sin_addr.s_addr=inet_addr(host);
        srv.sin_port=htons((unsigned short int)atol(port));
        srv.sin_family=AF_INET;

        if(connect(s, &srv, sizeof(srv))==-1)
        {
                perror("connect failed()");
                return -1;
        }
}

// Senden der Daten an das Socket
int sending(char* command)
{
        int sent;

        sent=send(s, command, strlen(command), 0);

        if(sent==-1);
        {
                perror("send()");
                return -1;
        }
}
int main()
{
        init_conn();

        sending("client_set name{lcdmpd}");
        sending("screen_add lcdmpd");
        sending("screen_set lcdmpd name {lcdmpd}");

        close(s);
}
Da mein letzte C-Programm um einiges kleiner waren und ich mich auch noch nie in C mit Socket Programmierung beschäftigt habe, bin ich im moment ein klein bißchen Ratlos und wäre über einen entsprechenden Hinweis woran es haken könnte sehr dankbar.
Viele Grüsse
Dan
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

Benutzeravatar
oldmangloom
Beiträge: 45
Registriert: 13.04.2005 13:42:20

Beitrag von oldmangloom » 19.07.2007 10:58:16

Hi,

es wäre natürlich nützlich zu wissen an welcher Stelle das Programm aufschlägt. Ich denke du musst da mal mit einem Debugger ran. Entweder gdb oder der von eclipse, wenn du damit programmierst.
Ansonsten würde ich mal nachgucken ob "char* command" der richtige Datentyp ist, soweit ich noch weiß muss das doch "void *" sein.

Viel Erfolg beim Debuggen,

oldmangloom

hawkeye78
Beiträge: 430
Registriert: 10.09.2004 17:02:01
Wohnort: castrop-rauxel

Beitrag von hawkeye78 » 19.07.2007 11:07:36

Hallo,

ich habe mittlerweile den Fehler entdeckt und vergessen den entsprechenden Beitrag zu editieren :oops:
Der Fehler war in der Abfrage (in der Methode "sending")
if(sent==-1);
{
perror("send()");
return -1;
}
wobei der Fehler einfach daraus bestand das ich hinter die if-Abfrage ein Semikolon gesetzt habe wo keins hingehörte.
Viele Grüsse
Dan
I love deadlines. I like the whooshing sound they make as they fly by - Douglas Adams

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 19.07.2007 20:32:12

hawkeye78 hat geschrieben:wobei der Fehler einfach daraus bestand das ich hinter die if-Abfrage ein Semikolon gesetzt habe wo keins hingehörte.
Für solche Probleme gibt es lint (ich weiss jetzt nicht, wie die Version in Debian für C heißt), aber das sollte dich auf solche Fehler aufmerksam machen

Benutzeravatar
oldmangloom
Beiträge: 45
Registriert: 13.04.2005 13:42:20

Beitrag von oldmangloom » 20.07.2007 13:01:15

Hi,

ich meine die lint-Version für Linux heißt splint. Ist aber schon länger her als ich das benutzt habe. Ich denke eclipse hätte das auch gemerkt, ist ja auch für C recht komfortabel (dank CDT).

Gruß,

oldmangloom

Antworten