View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 12:47 pm Post subject: Socket |
|
Baigaa probleema ar network programmeeshanu:
Objekti:clients uz Windows XP sisteemas,serveris uz LINUX sisteemas
API:SOCKET (WinSock un berkley socket)
Kods:
Code: |
bool Send(char* pBuffer,int nSize,int nClient)
{
if (nClient>=m_nClientCount) return false;
int nSent=0; //cik pavisam aizsuutiits
while (nSent<nSize) //kameer viss nav aizsuutiits
{
int n=send(m_sClients[nClient],pBuffer+nSent,nSize-nSent,0); //suutam
if (n==SOCKET_ERROR) //ja bija kljuuda,tad paartraucam
{
m_pApplication->Log("WinSock: Failed to send message");
return false;
}
nSent+=n;
}
return true;
}
|
Problema:
Ja no Windows XP sisteemas suutu veestuli uz LINUX
Code: |
struct SMessage
{
short sMessageID; //message tips
short sLength; //data length
void* pData;
};
SMessage sMessage;
sMessage.sMessageID=0;
sMessage.sLength=sizeof(short);
short sID=3;
sMessage.pData=(void*)&sID;
Send((char*)&sMessage,sizeof(SMessage)+sMessage.sLength,nClient));
|
tad viss straadaa,bet ja no LINUX sisteemas uz WindowsXP,tad nestraadaa.KAAPEEC!Vai LINUX pointerus izmanto savaadaak?Kur ir problema?Meegjinaaju arii taa:
Code: |
struct SMessage
{
short sMessageID; //message tips
short sLength; //data length
void* pData;
};
SMessage sMessage;
sMessage.sMessageID=0;
sMessage.sLength=sizeof(short);
short sID=3;
sMessage.pData=new char(sizeof(short));
memcpy(sMessage.pData,&sID,sizeof(short));
Send((char*)&sMessage,sizeof(SMessage)+sMessage.sLength,nClient));
|
bet tas arii nestraadaaja.Tad kaa pie visiem sveetajiem stikliniekiem,lai aizsuutu veestuli no LINUX uz Windows XP shaadaa veidaa?
P.S. Ar "nestraadaaja" es domaaju-clients sanjem nepareizu informaaciju(serveris(LNUX) aizsuuta 3,bet clients(Windows XP) sanjem -24776). _________________ long time; /* know C */
Last edited by elvman on Sun Mar 19, 2006 1:02 pm; edited 3 times in total |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 12:58 pm Post subject: |
|
Meegjinaaju dariit taa:
Code: |
short sID=3;
void* pData=(void*)&sID;
Send(pData,sizeof(short),nClient);
|
un tas straadaaja,taatad ir probleema ar SMessage struktuuru.Bet kaada tad ir taa probleema? _________________ long time; /* know C */ |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Sun Mar 19, 2006 1:01 pm Post subject: |
|
nu probleema ir tajaa, ka tu nosuuti SMessage::pData veertiibu, nevis to atminjas apgabalu uz kuru vinsh noraada.
EDIT: tb, pirmajaa koda gabalaa tu nosuuti sizeof(short)+sizeof(short)+sizeof(void*)+sizeof(short) baitus, (sizeof(SMessage)+sMessage.sLength), kuraa ietilpst SMessage struktuura un uzreiz aiz vinjas short sID, bet linux aciimredzot nenovieto abus vainiigos vienu aiz otra atminjaa un taapeec nenokopeejas sID bet kaut kaada cita veertiiba. citiem vaardiem, tu nevari kopeet SMessage struktuuru un cereet, ka nokopeesies arii taa atminja uz kuru noraada pointeri no taas struktuuras.
Last edited by GiGa on Sun Mar 19, 2006 1:10 pm; edited 1 time in total |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 1:07 pm Post subject: |
|
Hmm... Laba ideja!Uz Windows XP shis variants straadaa,bet laikam LINUX (gcc),atshkjiraas.Tuuliit pameegjinaashu nedaudz savaadaak. _________________ long time; /* know C */ |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 1:30 pm Post subject: |
|
BEIDZOT!Jaa.Tik ilgi mocijos un beigas atrisinaju.Luuk variants:
Code: |
char m_pBuffer[65536];//65536-maksimums,ko SOCKET var aizsuutiit vienaa reizee
{
short sID=3;
SMessage* pMessage=(SMessage*)m_pBuffer;//rakstam message buferii
pMessage->pData=(void*)&m_pBuffer[sizeof(SMessage)];//peec message naak bufferis
pMessage->sMessageID=MESSAGE_ID;
pMessage->sLength=sizeof(short);
memcpy(pMessage->pData,&sID,sizeof(short));
m_pNetworkSystem->Send(m_pBuffer,sizeof(SMessage)+pMessage->sLength,nClient);
}
|
Tas m_pBuffer netiek uztaisiits katru reizi,bet tas ir kaa viens bufferis,kuraa visu laiku tiek rakstiits. _________________ long time; /* know C */ |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Sun Mar 19, 2006 2:04 pm Post subject: |
|
Ieteiktu izdomaat, kaa atbriivoties no liekiem 4 (vai 8 uz 64bit sisteemaam) baitiem katraa messagaa. pData ir diezgan nelietderiigi nosuutiit. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 2:07 pm Post subject: |
|
Veel viena laba ideja!Nevienam tak tas pointeris nav vajadziigs.Vienkaarshi iznjemt vinju laukaa un uzreic peec message likt datus.Tas pointeris tur pilniigi nav vajadziigs.
--EDIT--
Code: |
char m_pBuffer[65536];//65536-maksimums,ko SOCKET var aizsuutiit vienaa reizee
{
short sID=3;
SMessage* pMessage=(SMessage*)m_pBuffer;//rakstam message buferii
pMessage->sMessageID=MESSAGE_ID;
pMessage->sLength=sizeof(short);
memcpy(&m_pBuffer[sizeof(SMessage)],&sID,sizeof(short)); //uzreiz peec SMessage rakstam datus
m_pNetworkSystem->Send(m_pBuffer,sizeof(SMessage)+pMessage->sLength,nClient);
} |
Un lieta dariita _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Mar 19, 2006 8:57 pm Post subject: |
|
Kāds kompilators tika uz Windows izmantots? |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 19, 2006 9:05 pm Post subject: |
|
Uz windows-Microsoft Visual Studio 2005 Express (8.0.50727.42)
Uz LINUX-gcc (3.4.2) _________________ long time; /* know C */ |
|
Back to top |
|
|
|