?
hi,
hab ab dann auch die -Wall option benutzt :-).
Aber ich hab noch ein kleines Problemchen:
Das gesamte Programm: (ignoriert mal, dass der sendingThread noch nicht ganz vollständig ist)
/*
* router.c
*
* Created on: 20.06.2010
* Author: andreas
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define BUFFERSIZE 1024
sem_t sem;
static void* listeningThread(void *arg) {
int sock, concrsock;
struct sockaddr_in addr;
char* buffer = malloc(BUFFERSIZE);
const int y = 1;
int retval;
socklen_t addrlen;
printf("Start des ListeningThreads\n");
if( (sock = socket(AF_INET, SOCK_STREAM, 0)) > 0) {
printf("Socket zum Empfangen erfolgreich angelegt\n");
fprintf(stderr, "%s\n", strerror(errno));
//printf("%d\n",sock1);
}
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int)) != 0) {
printf("setsockopt schlug fehl\n");
fprintf(stderr, "%s\n", strerror(errno));
}
addr.sin_family = AF_INET;
addr.sin_port = htons(17000);
addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) {
printf("Port kann nicht belegt werden\n");
fprintf(stderr, "%s\n", strerror(errno));
}
if( (listen(sock, 10)) != 0) {
printf("Listen nicht erfolgreich\n");
fprintf(stderr, "%s\n", strerror(errno));
}
addrlen = sizeof(struct sockaddr_in);
while(1) {
printf("ist am warten....\n");
sem_post(&sem);
concrsock = accept(sock, (struct sockaddr*)&addr, &addrlen);
if( concrsock > 0) {
printf("Es ist ein Klient (%s) verbunden...\n", inet_ntoa(addr.sin_addr));
}
printf("%d\n", concrsock);
printf("warten vorbei....\n");
buffer = "Ich lebe\0";
retval = send(concrsock, buffer, strlen(buffer), 0);
printf("Erfolgreich %d Bytes gesendet\n", retval);
/*fprintf(stderr, "%s\n", strerror(errno));*/
do {
retval = recv(concrsock, buffer, BUFFERSIZE-1, 0);
printf("Erfolgreich %d Bytes empfangen\n", retval);
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
printf("%s\n", buffer);
} while(strcmp(buffer, "complete"));
close(concrsock);
}
printf("Listening zu Ende");
}
static void* sendingThread(void* arg) {
sem_wait(&sem);
sem_post(&sem);
int sendingSocket;
char* buffer1 = malloc(BUFFERSIZE);
struct sockaddr_in address;
char* adr = "192.168.1.101\0";
char temp[255];
int retval;
printf("Start des Sending Threads\n");
if( (sendingSocket = socket(AF_INET, SOCK_STREAM,0)) > 0) {
printf("Socket zum Senden erfolgreich angelegt\n");
}
address.sin_family = AF_INET;
address.sin_port = htons(17000);
inet_aton(adr, &address.sin_addr);
printf("Verbinden?\n");
fgets(temp, 254, stdin);
if(connect(sendingSocket, (struct sockaddr*)&address, sizeof(address)) == 0) {
printf("Erfolgreich verbunden\n");
}
retval = recv(sendingSocket, buffer1, BUFFERSIZE-1, 0);
printf("Erfolgreich %d empfangen\n",retval);
printf("%s\n", buffer1);
buffer1 = "complete achja \0";
retval = send(sendingSocket, buffer1, strlen(buffer1), 0);
printf("Erolgreich %d Bytes gesendet\n",retval);
}
int main(void) {
pthread_t listeningID;
pthread_t sendingID;
char* dummy;
int** ret;
dummy = "Achja, du schon wieder\0";
sem_init(&sem, 0, 1);
sem_wait(&sem);
pthread_create(&listeningID, NULL, listeningThread, (void*)dummy);
pthread_create(&sendingID, NULL, sendingThread, (void*)dummy);
pthread_join(listeningID, (void**)ret);
exit(EXIT_SUCCESS);
}
gibt auf der Seite die senden will folgende Ausgabe:
Start des ListeningThreads
Socket zum Empfangen erfolgreich angelegt
Success
ist am warten....
Start des Sending Threads
Socket zum Senden erfolgreich angelegt
Verbinden?
y
Erfolgreich verbunden
Erfolgreich 8 empfangen
Ich lebe
Erolgreich 15 Bytes gesendet
Und auf der Seite die empfängt folgende Ausgabe:
Start des ListeningThreads
Socket zum Empfangen erfolgreich angelegt
Success
ist am warten....
Start des Sending Threads
Socket zum Senden erfolgreich angelegt
Verbinden?
Es ist ein Klient (192.168.1.102) verbunden...
5
warten vorbei....
Erfolgreich 8 Bytes gesendet
Success
Erfolgreich -1 Bytes empfangen
Bad address
Aber wieso schlägt recv hier fehl?
Die Adresse ist doch richtig?
mfg naja