|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Socket Win-Lin
Codice:
#ifndef SOCK_HPP #define SOCK_HPP #ifdef WIN32 #include <winsock2.h> typedef SOCKET sock_t; #define CLOSE(x) closesocket(x); WSACleanup(); #define SEND(sck, msg) send(sck, msg, sizeof(msg), 0); #define RECV(sck, msg) recv(sck, msg, sizeof(msg), 0); #elif def LINUX #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> typedef int sock_t; #define CLOSE(x) close(x); #define SEND(sck, msg) write(sck,msg,strlen(msg)) #define RECV(sck, msg) read(sck,msg,strlen(msg)) #endif #endif Tnk
__________________
Gnu/Linux User
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Re: Socket Win-Lin
Sì e no.
Innanzitutto una nota cosmetica: nelle macro non aggiungere il ";" (altrimenti negli if...else sei fregato). Per lo stesso motivo, se hai #define a(x) b(x); c(x); dovresti scrivere Codice:
#define a(x) do { \
b(x); \
c(x); } while(0)
Infine, usa anche nella versione linux le funzioni send e recv -- sono praticamente le stesse che su windows.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 17-05-2004 alle 21:03. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
ecco il code finale:
Codice:
#ifndef SOCK_HPP
#define SOCK_HPP
#include <iostream>
/// Safe Array deleting
#define ARRAY_SAFE_DELETE(ptr) delete[] ptr; ptr = NULL;
///
/// This is a generalization of socket
///
typedef int sock_t;
#ifdef __WIN__
//#warning "Win32 Mode On"
#include <winsock2.h>
#define CLOSE(x) closesocket(x);
#define SEND(sck, msg) send(sck, msg, sizeof(msg), 0)
#define RECV(sck, msg) recv(sck, msg, sizeof(msg), 0)
#elif defined(__LINUX__)
#warning "Linux Mode On"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define CLOSE(x) close(x);
#define SEND(sck, msg) write(sck,msg,strlen(msg))
#define RECV(sck, msg) read(sck,msg,strlen(msg))
#endif
/// The Error Enum
enum
{
ERR_SOCK_INVALID = 0x0, /// invalid socket
ERR_SOCK_CONNECT, /// error in connection
ERR_SOCK_SEND, /// error in send
ERR_SOCK_RECV, /// error in recv
};
///
/// Client Socket
///
class CClientSocket
{
private:
sock_t my_socket;
#ifdef __WIN__
WSAData wsaData;
#endif
struct hostent *host_entry;
struct sockaddr_in server;
public:
CClientSocket();
~CClientSocket();
int Build(const std::string addr, unsigned short port);
void Close();
int Read(char *buf);
int Write(char *buf);
};
CClientSocket::CClientSocket()
{
#ifdef __WIN__
WSAStartup(MAKEWORD(2, 2), &wsaData);
#endif
}
CClientSocket::~CClientSocket()
{
}
int CClientSocket::Read(char *buf)
{
if(RECV(my_socket, buf) != 0)
return ERR_SOCK_RECV;
return 0;
}
int CClientSocket::Write(char *buf)
{
if(SEND(my_socket, buf) != 0)
return ERR_SOCK_SEND;
return 0;
}
int CClientSocket::Build(const std::string addr, unsigned short port)
{
my_socket = socket(AF_INET,SOCK_STREAM,0);
host_entry = gethostbyname(addr.c_str());
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = *(unsigned long*) host_entry->h_addr;
if(connect(my_socket, (sockaddr*)&server, sizeof(server)) != 0)
return ERR_SOCK_CONNECT;
return 0;
}
void CClientSocket::Close()
{
CLOSE(my_socket)
}
#endif
__________________
Gnu/Linux User
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
A parte il fatto che hai ignorato metà dei miei suggerimenti (
#define RECV(sck, msg) recv(sck, msg, sizeof(msg), 0) Mi ascolti, eh?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Anche queste sono castronerie
if(RECV(my_socket, buf) != 0) return ERR_SOCK_RECV; if(SEND(my_socket, buf) != 0) return ERR_SOCK_SEND;
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Altre imprecisioni minori:
my_socket = socket(AF_INET,SOCK_STREAM,0); Non controlli il valore di ritorno nel caso che la socket fallisca. host_entry = gethostbyname(addr.c_str()); Se l'host non esiste/non è raggiungibile, la funzione ritorna NULL. Attenzione se fai applicazioni multithread: la gethostbyname non è "reentrant" (almeno su linux; esiste la gethostbyname_r) if(connect(my_socket, (sockaddr*)&server, sizeof(server)) != 0) return ERR_SOCK_CONNECT; Se la connect fallisce, chi libera il socket che hai allocato poche righe sopra?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
tnk x i suggerimenti.
Ora li mettero in pratica
__________________
Gnu/Linux User
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:32.



















