• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

andreb

Sockets

4 mensagens neste tópico

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 :P

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);
}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O scanf do cliente só está a ler a 1ª palavra. Utiliza gets(&servermsg) em vez de scanf("%s", &servermsg);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol, não ligues... tem que ser gets(servermsg), sem o &, porque servermsg já se comporta como um endereço.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora