ANSI C TCP SZERVER - KLIENS játék (akasztófa)
2010-12-13T15:57:09+01:00
2010-12-14T09:43:06+01:00
2022-07-24T20:46:20+02:00
  • Azért nem írta, mert ilyen apróságokra igazából nem szánnak rá semennyit. Félév van az egyetemeken és partra sodort vmi szemetet a vizsga-dagály.

    Néhány egyetemista kapott egy feladatot, amit nem tud megoldani. Van, aki elkap egy koleszos havert, aki zsebbe 1-2 ezresért megcsinálja neki, akinek meg nincs ilyen haverja, első körben bekap egy karót, második körben pedig vadászik vmit előző évfolyamosoktól, amit átpofoz egy kicsit, oszt jólvan. Szerintem nem éri meg az időt vesződni vele. Ez egyedül az ő problémájuk.
    Mutasd a teljes hozzászólást!
  • Ahaaaam, szóval csak be kéne linuxolni. Akkor miért nem mondod neki, hogy ne a winsock2-t includolja, hanem a linsock2-t?

    ---
    Tetszik nagyon ez a
    sockettelés
    .
    Mutasd a teljes hozzászólást!
  • Ez mar meg van socketelve, mar csak linuxolni kene!
    Mutasd a teljes hozzászólást!
  • Nem írtad, hogy mennyit szánsz rá.
    Mutasd a teljes hozzászólást!
  • Üdv!

    Nekem az alábbi problémám van. Még soha nem foglalkoztam socket programozással és készítenem kellene egy server és egy kliens programot amelynek az lenne a lényege, hogy 2 személy feljelentkezik a szerverre és ott akasztófát játszanak megkaptam a progikat de windows-alatt íródtak és nekem meg linux alatt kellene megírnom

    Sajnos nem értek a C-hez így nem tudom átírni normálisan. Előre is köszönöm a segítséget.

    Kliens

    #include <stdio.h> #include <stdlib.h> #include<winsock2.h> #include<ctype.h> #include<string.h> typedef struct ssockaddr_in { SHORT sin_family; USHORT sin_port; struct in_addr sin_addr; CHAR sin_zero[8]; } sockaddr_in; int main() { WSADATA wsaData; char* szoveg=NULL; int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != NO_ERROR) printf("Client: Error at WSAStartup().\n"); // Create a SOCKET for connecting to server SOCKET ConnectSocket; ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ConnectSocket == INVALID_SOCKET) { printf("Client: Error at socket(): %ld.\n", WSAGetLastError()); WSACleanup(); return 0; } char ip[16]; printf("Add meg az IP cimet: "); scanf("%s", ip); // Struktúra a címeknek // IP cím illetve protszám beállítása, az Ip címet a standard inputról kérjük be sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr(ip); clientService.sin_port = htons(5555); //Csatlakozás a szerverhez if (connect(ConnectSocket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) { printf("Sikertelen kapcsolodas.\n"); WSACleanup(); return 0; } //A programban használt változók int sent; int received; char buffer[3]; char buffer2[3]; char betu; //A a program a szervertől várja a szó hosszát received=recv(ConnectSocket,buffer,3,0); //dinamikus karaktertömb a szónak szoveg=(char*)malloc(sizeof(char)*buffer[0]); int i=0; int lehetosegek=0; for(i=0;i<buffer[0];i++) szoveg[i]='-'; szoveg[buffer[0]]='\0'; puts(szoveg); printf("\n"); received=recv(ConnectSocket,buffer,3,0); lehetosegek=buffer[0]; //A főciklus melyben a a send-receive függvények hívódnak while(1){ fflush(stdin); printf("Lehetosegek: %d\n",lehetosegek); printf("Adja meg a betut: "); scanf("%c",&betu); buffer[0]=betu; //A felhasználó által beütött betű elküldése a szervernek //A send függvény első paramétere a socket amellyel csatlakozunk, a második az a tömb amit elküldünk, a harmadik pedig a tömb mérete, a negyedik a kapcsolat tulajdonságait jelzi sent=send(ConnectSocket,buffer,3,0); //Ha nem sikerül elküldeni a a buffert akkor hibaüzenet íródik ki if(sent==SOCKET_ERROR) printf("Sikertelen a kuldes\n"); //A szóhossz fogadása a szervertől received=recv(ConnectSocket,buffer,3,0); //Azt vizsgálom hogy a betű benne van e a szóban if(buffer[0]!='<') { //Jelen esetben a buffer 0. elem tartalmazza azt hogy a leütött betű hányszor fordul elő a szóban for(i=1;i<=buffer[0];i++) { //Az adott betű illetve annak pozícióinak fogadása a szervertől received=recv(ConnectSocket,buffer,3,0); szoveg[buffer[2]]=buffer[1]; } system("CLS"); printf("%s\n",szoveg); } // Ha a buffer 0. eleme < akkor a betű nincs benne a szóban else { printf("Nincs benne ez a betu!\n"); lehetosegek=buffer[1];} //A "játévége jel" fogadása a szervertől received=recv(ConnectSocket,buffer,3,0); if(lehetosegek==0) { printf("Sajnos elfogytak a lehetosegeid"); break;} if(buffer[0]=='.') { printf("Gratulalok kitalaltad a szot :)"); break;} } closesocket(ConnectSocket); WSACleanup(); return 0; }


    SZERVER


    #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include<ctype.h> #include<string.h> #include <windows.h> //Struktúra a kapcsolat tulajdonságainak typedef struct ssockaddr_in { SHORT sin_family; // USHORT sin_port; //portszám struct in_addr sin_addr; //Ip cím CHAR sin_zero[8]; } sockaddr_in; //függvény annak eldöntésére hogy az adott betű benne van e a szóban, illetve hányszor fordul elő //ha nincs benne az adott betű akkor 0 a visszatérési értéke int strcompare(char kar, char* string) { int i=0; int darab=0; for(i=0;i<strlen(string);i++) if(string[i]==kar) darab++; if(darab==0) return 0; return darab; } int main(){ int received,sent; int szohossz; char szo[100]; char szo2[100]; char buffer[3]; char ipcim[16]; int lehetosegek=0; //Változók az esetleges kapcsolati hibák kezeléséhez WORD wVersionRequested; WSADATA wsaData; int wsaerr; wVersionRequested = MAKEWORD(2, 2); wsaerr = WSAStartup(wVersionRequested, &wsaData); //A socket deklarációja amelyhez a kliens fog kapcsolódni SOCKET m_socket; //A socket létrehozása a socket függvénnyel, első paramétere a hálózat típusát jelzi, a második a stream alapú kommunikációt, a harmadik pedig a protokollt m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in service; service.sin_family = AF_INET; //A kommunikációs port megadása service.sin_port=htons(5555); //Az IP cím bekérése a standard inputról printf("Adja meg az IP cimet: "); scanf("%s",ipcim); service.sin_addr.s_addr=inet_addr(ipcim); //A socket kötése bind(m_socket, (SOCKADDR*)&service, sizeof(service)); //a következő eljárás aktiválja a socketet listen(m_socket, 10); //Socketdeklaráció amely a kliens socketjét állítja be SOCKET acceptsocket; printf("Varakozas a jatekosra\n"); //az accept függvény akkor fut le ha egy kliens csatlakozott a sockethez acceptsocket = accept(m_socket, NULL, NULL); printf("Megjott a jatekos\n"); //A kitalálandó szó bekérése a standard inputról fflush(stdin); printf("Adja meg a szot\n"); gets(szo); szohossz=strlen(szo); int i=0; for(i=0;i<strlen(szo);i++) szo2[i]='-'; buffer[0]=szohossz; lehetosegek=szohossz-3; //A szóhossz elküldése a kliensnek sent=send(acceptsocket,buffer,3,0); buffer[0]=lehetosegek; sent=send(acceptsocket,buffer,3,0); if(sent==SOCKET_ERROR) printf("Sikertelen kuldes\n"); int darab=0; char c; while(1){ received=recv(acceptsocket,buffer,3,0); if(received==SOCKET_ERROR) {printf("Megszakadt a kapcsolat a klienssel\n"); break;} darab=strcompare(buffer[0],szo); c=buffer[0]; if(darab!=0){ buffer[0]=darab; sent=send(acceptsocket,buffer,3,0); for(i=0;i<strlen(szo);i++) if(szo[i]==c) { buffer[1]=c; buffer[2]=i; szo2[i]=c; sent=send(acceptsocket,buffer,3,0); } } else { buffer[0]='<'; buffer[1]=--lehetosegek; sent=send(acceptsocket,buffer,3,0);} if(strcompare('-',szo2)==0) { buffer[0]='.'; sent=send(acceptsocket,buffer,3,0); break;} else{ sent=send(acceptsocket,buffer,3,0);} } fflush(stdin); printf("A jatek veget ert! "); getchar(); closesocket(m_socket); closesocket(acceptsocket); WSACleanup(); return 0; }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd