Bekomme Fehlermedlung wegen socket
-
HI,
tolles Forum. Echt.
Bekomme folgende Fehlermeldung, bei Übung aus dem Buch:…
server got connection from 32.157.127.183 prot 1032
accepting connection: Socket operation on non-socket
…Kann auch nicht mit telnet oder so connecten... villt kann ja wer helfen
server.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include "hacking.h" #define PORT 7790 int main(void) { int sockfd, new_sockfd; struct sockaddr_in host_addr, client_addr; int recv_length=1, yes=1; socklen_t sin_size; char buffer[1024]; if((sockfd=(PF_INET, SOCK_STREAM, 0))==-1) perror("in socket"); if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))==-1) perror("in setting options"); host_addr.sin_family = AF_INET; host_addr.sin_port = htons(PORT); host_addr.sin_addr.s_addr = 0; memset(&(host_addr.sin_zero), '0', 8); if(bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr))==-1) perror("in binding"); if(listen(sockfd, 5)==-1) perror("in listening on socket"); while(1){ sin_size = sizeof(struct sockaddr_in); new_sockfd = accept(sockfd, (struct sockaddr *) &client_addr, &sin_size); if(new_sockfd == -1) perror("accepting connection"); printf("server got connection from %s prot %d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); send(new_sockfd, "Hello, world!\n", 13,0); recv_length = recv(new_sockfd,&buffer,1024,0); while (recv_length > 0) { printf( "RECV: %d bytes\n", recv_length ); dump(buffer, recv_length); recv_length = recv(new_sockfd, &buffer, 1024, 0); } close(new_sockfd); } return 0; }
hacking.h
void dump(const unsigned char *data_buffer, const unsigned int length) { unsigned char byte; unsigned int i,j; for ( i = 0; i < length; i++) { byte = data_buffer[i]; printf( "%02x ", data_buffer[i]); if(((i%16)==15) || (i == length-1)) { for ( j = 0; j < length; j++) printf (" "); printf( "| " ); for ( j =(i-(i%16)); j <= i; j++) { byte = data_buffer[j]; if((byte > 31) && (byte < 127)) printf( "%c", byte ); else printf( "." ); } printf( "\n" ); } } }
mfg theone
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Bei Zeile 21 fehlt das
socket()
Bei Ziele 34 muss es heißensizeof(struct sockaddr_in)
+ das was ich nicht gesehen habe.Kompilier das nächste mal mit Warnungen:
test.c: In function ‘main’:
test.c:46: warning: left-hand operand of comma expression has no effect
test.c:46: warning: left-hand operand of comma expression has no effect
test.c:79: warning: pointer targets in passing argument 1 of ‘dump’ differ in signedness
test.c:7: note: expected ‘const unsigned char *’ but argument is of type ‘char *’
test.c:83: warning: implicit declaration of function ‘close’Achtung, Zeilennummern verschoben da
hacking.h
mit Copy & Paste eingefügt.
-
Oh, okay danke - war verschlafen, dass mit socket() fehlte
Aber hier, wegen dem anderen da:
sockaddr-Struktur(Generische Struktur) <--------><-----------------------------------------------> |Fam|ilie| | | | | | |sa_ |data | | | | | | | sockaddr_in-Struktur(für IP Version 4) <--------><---><------------><----------------------------> |Fam|ilie|Po|nr| |IP|Ad| |8Fül|lbytes| | | | | | | rt . r.
mfg
Ps: Hatte viel Arbeit heute, bin verschlafen
-
Meine man-page sagt zu bind() folgendes:
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);[..]
addrlen specifies the size, in bytes, of the
address structure pointed to by addr[..]
gruß