'select'-Problem
-
Hi, nach dem ersten Datenaustausch kommt ein select Error und nicht funktioniert mehr und ich weiß nicht warum.
Hier der Code:
Server:#include <windows.h> #include <stdio.h> #define SERVER_PORT 1209 #define MAX_CLIENT 100 #pragma comment(lib, "ws2_32.lib") int StartWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } int main(int argc, char *argv[]) { int i; int len; int clients = 0; int eax; FD_SET fd; SOCKET s; SOCKET client[MAX_CLIENT - 1]; SOCKADDR_IN addr; char szPuffer[512]; SOCKADDR_IN cinfo[MAX_CLIENT -1]; eax = StartWinsock(); if(eax != 0) { printf("\'StartWinsock\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } for(i = 0; i < MAX_CLIENT; ++i) { client[i] = INVALID_SOCKET; memset(&cinfo[i], 0x00, sizeof(SOCKADDR_IN)); } s = socket(AF_INET, SOCK_STREAM, 0); if(s == INVALID_SOCKET) { printf("Socket-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } memset(&addr, 0x00, sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); eax = bind(s, (SOCKADDR *)&addr, sizeof(SOCKADDR_IN)); if(eax == SOCKET_ERROR) { printf("\'bind\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } eax = listen(s, MAX_CLIENT); if(eax == SOCKET_ERROR) { printf("\'listen\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } while(TRUE) { FD_ZERO(&fd); FD_SET(s, &fd); for(i = 0; i < MAX_CLIENT; ++i) { if(client[i] != INVALID_SOCKET) FD_SET(client[i], &fd); } eax = select(0, &fd, NULL, NULL, NULL); if(eax == SOCKET_ERROR) { printf("\'select\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx\n", GetLastError()); } if(FD_ISSET(s, &fd)) { for(i = 0; i < MAX_CLIENT; ++i) { if(client[i] == INVALID_SOCKET) { len = sizeof(SOCKADDR_IN); client[i] = accept(s, (SOCKADDR *)&cinfo[i], &len); printf("Client #%d: %s\n", clients + 1, inet_ntoa(cinfo[i].sin_addr)); break; } } } for(i = 0; i < MAX_CLIENT; ++i) { if(client[i] == INVALID_SOCKET) continue; else if(FD_ISSET(client[i], &fd)) { eax = recv(client[i], szPuffer, sizeof(szPuffer), 0); if(eax == 0 || eax == SOCKET_ERROR) { closesocket(client[i]); client[i] = INVALID_SOCKET; } else { szPuffer[eax] = '\0'; strcpy(szPuffer, "Hallo zurück."); send(client[i], szPuffer, strlen(szPuffer), 0); } } } } } closesocket(s); WSACleanup(); getchar(); return 0; }
Client:
#include <windows.h> #include <stdio.h> #define SERVER_PORT 1209 #define SERVER_IP "localhost" #pragma comment(lib, "ws2_32.lib") int StartWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0), &wsa); } int main(int argc, char *argv[]) { int eax; SOCKET s; SOCKADDR_IN addr; char szPuffer[512]; struct hostent *hinfo; unsigned long hostn; eax = StartWinsock(); if(eax != 0) { printf("\'StartWinsock\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } s = socket(AF_INET, SOCK_STREAM, 0); if(s == INVALID_SOCKET) { printf("Socket-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } memset(&addr, 0x00, sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); if(hostn = inet_addr(SERVER_IP) != INADDR_NONE) memcpy(&addr.sin_addr, &hostn, sizeof(hostn)); else { hinfo = gethostbyname(SERVER_IP); if(hinfo == NULL) { printf("Unknown Server-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } memcpy(&addr.sin_addr, hinfo->h_addr, hinfo->h_length); } eax = connect(s, (SOCKADDR *)&addr, sizeof(SOCKADDR_IN)); if(eax == SOCKET_ERROR) { printf("Connect-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } while(TRUE) { strcpy(szPuffer, "Hallo"); send(s, szPuffer, strlen(szPuffer), 0); eax = recv(s, szPuffer, sizeof(szPuffer), 0); if(eax == 0) { printf("Server closed Connection...\nif not check MSDN [%d]: http://msdn.microsoft.com/en-us/library/ms681381.aspx", GetLastError()); getchar(); return 1; } else if(eax == SOCKET_ERROR) { printf("\'recv\'-Error...\n[%d] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx\n", GetLastError()); } szPuffer[eax] = '\0'; } closesocket(s); WSACleanup(); getchar(); return 0; }
Error:
'select'-Error...
[10038] check MSDN: http://msdn.microsoft.com/en-us/library/ms681381.aspx
-
Wie wärs wenn du die Fehlermeldung mal durchliest? Macht der Typ sein Programm schon so DAU-sicher und gibt neben dem Errorcode noch gleich den Link zur MSDN mit an und du checkst es immer noch nicht. Da fehlen einem die Worte. Lern halt erstmal programmieren.
-
WSAENOTSOCK
10038
0x2736
An operation was attempted on something that is not a socket.Was ist denn damit gemeint?
if(client[i] != INVALID_SOCKET) { FD_SET(client[i], &fd); } eax = select(0, &fd, NULL, NULL, NULL);
Dann müssten doch nur funktionierende Sockets in fd sein, oder nicht?
-
Ich bin den Code nun mehrmals durchgegangen und finde den Fehler leider immer noch nicht
-
Irgendeiner von euch Profis müsste doch wissen, woher der Fehler kommt
-
SOCKET client[MAX_CLIENT - 1];
Du indizierst in der Folge das Array client immer zu weit.
Wenn MAX_CLIENT == 100, dann hast Du 99 Element in client, die Du mit 0 - 98 indizieren kannst. Deine for - Schleifen gehen aber immer bis i < MAX_CLIENT, also bis 99.