'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.


Anmelden zum Antworten