andreb Posted May 20, 2008 at 06:14 PM Report Share #186309 Posted May 20, 2008 at 06:14 PM Boas amigos, eu tenho aqui duas sources, uma de cliente e outra de server, em que eu alterei algumas coisas.. eu pretendo fazer um mensageiro.. mas quando vou mandar uma mensagem do client para o server apenas manda a primeira palavra alguém me pode ajudar?? ps: o server ainda não consegue mandar mensagens.. quero aprofundar melhor isto dos sockets e depois talvez fazer uma guizita 😛 Server: #include <windows.h> //Required for socket init #include <winable.h> #include <iostream> #include <fstream> #include <string> using namespace std; using namespace System; int main(){ startagain: char servermsg[0x100]; string svmsg; WSAData wsdata; //Declare WSAData WORD wsver=MAKEWORD(2, 0); //We want Winsock 2.0 int nret=WSAStartup(wsver, &wsdata); //Pass version 2.0 and pointer to implement if(nret != 0){ //Init failed /*A successful return value should be 0 */ std::cout<<"Startup failed, error code: "<<WSAGetLastError(); //Returns error code WSACleanup(); //Cleanup Winsock library return -1; } std::cout<<"Init success\n"; SOCKET kSock=socket(AF_INET, SOCK_STREAM, 0); if(kSock == INVALID_SOCKET){ std::cout<<"Socket init failed"; return -1; } std::cout<<"Socket initialized\n"; sockaddr_in sin; sin.sin_port=htons(808); sin.sin_addr.s_addr=INADDR_ANY; sin.sin_family=AF_INET; if(bind(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){ std::cout<<"Failed to bind\n"; WSACleanup(); //Cleanup Winsock library return -1; } std::cout<<"Bind successful!\n"; while (listen(kSock, SOMAXCONN) == SOCKET_ERROR); //Loop in order to constantly listen /* set the number of connections to SOMAXCONN, in which case the provider chooses a reasonable value (5 in Windows XP Professional) */ SOCKET client; int len = sizeof(sin); client=accept(kSock, (sockaddr*)&sin, &len); std::cout<<"Connection established!\n"; while(recv(client, servermsg, sizeof(servermsg), 0)!=-1){ svmsg=servermsg; if(svmsg=="!exitsv") { closesocket(client); closesocket(kSock); return 0; } if(svmsg=="!beep") { Beep(800,1000); } cout << "Client: " << servermsg << "\n"; } closesocket(client); closesocket(kSock); goto startagain; } Cliente: #include <windows.h> //Required for socket init #include <iostream> #include <fstream> #include <string> using namespace std; int main(){ char servermsg[0x100]="lool"; string svmsg; char ip[0x100]; printf("IP to Connect: "); scanf("%s",&ip); WSAData wsdata; //Declare WSAData WORD wsver=MAKEWORD(2, 0); //We want Winsock 2.0 int nret=WSAStartup(wsver, &wsdata); //Pass version 2.0 and pointer to implement if(nret != 0){ //Init failed /*A successful return value should be 0 */ std::cout<<"Startup failed, error code: "<<WSAGetLastError(); //Returns error code WSACleanup(); //Cleanup Winsock library return -1; } std::cout<<"Init success\n"; SOCKET kSock=socket(AF_INET, SOCK_STREAM, 0); if(kSock == INVALID_SOCKET){ std::cout<<"Socket init failed"; return -1; } std::cout<<"Socket initialized\n"; sockaddr_in sin; sin.sin_port=htons(808); //Connect to port 808 sin.sin_addr.s_addr=inet_addr(ip); //Connect to localhost "127.0.0.1" sin.sin_family=AF_INET; if(connect(kSock,(sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR){ //Check the condition std::cout<<"Connect failed, error: "<<WSAGetLastError(); //Returns error code WSACleanup(); //Cleanup the library return -1; } std::cout<<"Connection successful!\n"; system("cls"); while(1){ char servermsg[0x100]="lool"; cout << "Command: "; scanf("%s", &servermsg); svmsg=servermsg; system("cls"); if(svmsg=="!exitsv") { send(kSock, "!exitsv", 7, 0); closesocket(kSock); return 0; } send(kSock, servermsg, sizeof(servermsg), 0); } } ... Link to comment Share on other sites More sharing options...
TheDark Posted May 20, 2008 at 06:49 PM Report Share #186313 Posted May 20, 2008 at 06:49 PM O scanf do cliente só está a ler a 1ª palavra. Utiliza gets(&servermsg) em vez de scanf("%s", &servermsg); Desaparecido. Link to comment Share on other sites More sharing options...
andreb Posted May 20, 2008 at 06:57 PM Author Report Share #186314 Posted May 20, 2008 at 06:57 PM boas obg por responderes tão rápido mas não compila. 1>..\..\src\Client\Main.cpp(54) : error C2664: 'gets' : cannot convert parameter 1 from 'char (*)[256]' to 'char *' aparece este erro.. devido a "servermsg" estar definido com o tamanho [0x100] e se eu tirar passa a dar erros na parte dos sockets será que existe outra maneira? cumps andreb edit: esta resolvido obg fui consultar um site e não é "gets(&servermsg)" mas sim "gets(servermsg)" ... Link to comment Share on other sites More sharing options...
TheDark Posted May 20, 2008 at 11:01 PM Report Share #186391 Posted May 20, 2008 at 11:01 PM lol, não ligues... tem que ser gets(servermsg), sem o &, porque servermsg já se comporta como um endereço. Desaparecido. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now