Problem mit Server und Client
-
Hallo Member!
Ich habe mir heute einen Server und den dazugehörigen Client zusammen gebastelt. Ein par Tutorials haben mir dabei geholfen, deswegen sind manche Benennungen auf Deutsch, andere in Englisch.
Ich habe aber ein kleines Problem: Ich möchte, dass der Server empfangen und senden kann (also Daten senden) und ich möchte, dass der Client das selbe kann. Aber ich bekomm das einfach nicht hin! es wäre nett, wenn mir da jemand von euch helfen kann!
Vielen Dank im Vorraus
Hier mal der Code vom Server:
#include <windows.h> #include <winsock.h> #include <stdio.h> #define NETWORK_ERROR -1 #define NETWORK_OK 0 void ReportError(int, const char*); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { WORD sockVersion; WSADATA wsaData; int nret; sockVersion = MAKEWORD(1, 1); WSAStartup(sockVersion, &wsaData); SOCKET listeningSocket; listeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(listeningSocket == INVALID_SOCKET) { nret = WSAGetLastError(); ReportError(nret, "socket()"); WSACleanup(); return NETWORK_ERROR; } SOCKADDR_IN serverInfo; serverInfo.sin_family = AF_INET; serverInfo.sin_addr.s_addr = INADDR_ANY; serverInfo.sin_port = htons(8888); nret = bind(listeningSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)); if(nret == SOCKET_ERROR) { nret = WSAGetLastError(); ReportError(nret, "bind()"); WSACleanup(); return NETWORK_ERROR; } nret = listen(listeningSocket, 10); if (nret == SOCKET_ERROR) { nret = WSAGetLastError(); ReportError(nret, "listen()"); WSACleanup(); return NETWORK_ERROR; } SOCKET theClient; theClient = accept(listeningSocket, NULL, NULL); if (theClient == INVALID_SOCKET) { nret = WSAGetLastError(); ReportError(nret, "accept()"); WSACleanup(); return NETWORK_ERROR; } else { printf("Connection accepted\n\n"); int willkommen(); system("PAUSE"); } closesocket(theClient); closesocket(listeningSocket); WSACleanup(); return NETWORK_OK; } int willkommen(int s) { int bytes; char buffer[] = "Willkommen auf dem Server!\r\n"; bytes = send(s, buffer, strlen(buffer), 0); if (bytes == 1) { printf("send() failed!"); return -1; } } void ReportError(int errorCode, const char *whichFunc) { char errorMsg[92]; ZeroMemory(errorMsg, 92); sprintf(errorMsg, "Call to %s returned error %d", (char *)whichFunc, errorCode); MessageBox(NULL, errorMsg, "socketIndication", MB_OK); }Und hier mal der Client:
#include <windows.h> #include <winsock.h> #include <stdio.h> #define NETWORK_ERROR -1 #define NETWORK_OK 0 #define BUFFER_SIZE 1024 void ReportError(int, const char *); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) { WORD sockVersion; WSADATA wsaData; int nret; sockVersion = MAKEWORD(1, 1); WSAStartup(sockVersion, &wsaData); LPHOSTENT hostEntry; in_addr iaHost; iaHost.s_addr = inet_addr("127.0.0.1"); hostEntry = gethostbyaddr((const char *)&iaHost, sizeof(struct in_addr), AF_INET); if(!hostEntry) { nret = WSAGetLastError(); ReportError(nret, "gethostbyaddr()"); WSACleanup(); return NETWORK_ERROR; } SOCKET theSocket; theSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(theSocket == INVALID_SOCKET) { nret = WSAGetLastError(); ReportError(nret, "socket()"); WSACleanup(); return NETWORK_ERROR; } SOCKADDR_IN serverInfo; serverInfo.sin_family = AF_INET; serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); serverInfo.sin_port = htons(8888); nret = connect (theSocket, (LPSOCKADDR)&serverInfo, sizeof(struct sockaddr)); if (nret == SOCKET_ERROR) { nret = WSAGetLastError(); ReportError(nret, "connect()"); WSACleanup(); return NETWORK_ERROR; } else { printf("Successfully connected.\n\n"); int empfangen(); } closesocket(theSocket); WSACleanup(); return NETWORK_OK; } int empfangen(int s) { char buffer[BUFFER_SIZE]; int bytes; bytes = recv(s, buffer, sizeof(buffer) -1, 0); if (bytes == 1) { printf("recv() failed!"); return -1; buffer[bytes] = '\0'; printf("Server: %s", buffer); } return 0; } void ReportError(int errorCode, const char *whichFunc) { char errorMsg[92]; ZeroMemory(errorMsg, 92); sprintf(errorMsg, "Call to %s returned error %d!", (char *)whichFunc, errorCode); MessageBox(NULL, errorMsg, "socketIndication", MB_OK); }
-
Ich würde dir raten ein Tutorial über die _Grundlagen_ zu lesen. Und erst wenn du die Grundlagen beherrscht, dich mit Socketprogrammierung zu beschäftigen.
Und bedenke: Copy&Paste bringt dich nicht weiter
-
also ich habe mir das ganze nicht einfach rauskopiert, sondern ich ahbe mir die tutorials angeschaut und das teil dann geschrieben - und nicht copy and paste verwendet.
und..
1. ich habe mir ein par tutorials zum thema angeschaut und kann bererits ein bisschen was
und
2. kein copy and paste.....und
3. bringt mich deine antwort auch nicht viel weiter.Ich programmiere schon länger in C++ und weiß schon, dass mich copy und paste nicht weiterbringt, dass brauchst du einem erfahrenen php programmierer nicht mehr zu sagen.
-
Abgesehen davon gehört das nach WinAPI
-
sorry, hab ich verplant!
-
Dieser Thread wurde von Moderator/in flenders aus dem Forum Webzeugs in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
gutu tut's für deine sammlung
http://www.c-worker.ch/funktionen ruft man ohne rückgabewerte auf.
cf.ru schrieb:
willkommen();parameter ?
cf.ru schrieb:
empfangen();parameter ?
-
Was fällt denn dann noch sofort bei betrachten der Funktion "empfangen()" auf?
int empfangen(int s) { char buffer[BUFFER_SIZE]; int bytes; bytes = recv(s, buffer, sizeof(buffer) -1, 0); if (bytes == 1) { printf("recv() failed!"); return -1; buffer[bytes] = '\0'; printf("Server: %s", buffer); } return 0; }
-
Hepi schrieb:
Was fällt denn dann noch sofort bei betrachten der Funktion "empfangen()" auf?
ich weis es, ich weis es *freuwiekleineskind*

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.asp
so siehst es schon besser aus
bytes = recv(s, buffer, sizeof(buffer), 0); if(bytes == 0) { printf("Server hat die Verbindung getrennt..\n"); return -1; } if(bytes == SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); return -1; } buffer[bytes]='\0'; printf("\nServer antwortet: %s\n",buffer);
-
ahhh, vielen dank für eure antworten! werde gleich mal versuchen, dass bei mir zum laufen zu bekommen!
-
geht doch nicht! habe es ausprobiert und es läuft nicht

-
was geht nicht ? wo hängt es ? rückgabewerte ? getlasterror ?
-
gibt es überhaupt eine verbindung???
und gib mal in willkommen() als parameter den listeningSocket ein
und bei empfangen() als parameter theSocket