Jump to content

Sockets


andreb
 Share

Recommended Posts

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.