Schimb de soclu între winsock și QTcpServer

Am găsit acest cod socket cu winsock2.h http: //www.tidytutorials.com/2009/12/c-winsock-example-using-client-server.html Acesta este un cod pentru clientul meu.

int hsock;
int * p_int ;
hsock = socket(AF_INET, SOCK_STREAM, 0);
///

char buffer[1024];
int buffer_len = 1024;
int bytecount;

int c;
memset(buffer, '\0', buffer_len);

for(char* p=buffer ; (c=getch())!=13 ; p++){
    printf("%c", c);
    *p = c;
}

if( (bytecount=send(hsock, buffer, strlen(buffer),0))==SOCKET_ERROR){

codul pentru server se face cu Qt QTcpServer Class:

void FortuneThread::run()
   {
   QTcpSocket tcpSocket;
   if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
       emit error(tcpSocket.error());
       cout<<"socket error"<<< &socketDescriptor;
    out << buffer;
    out << strlen(buffer);
    out << 0;

    tcpSocket.write(block);

Codul de mai sus al serverului este încercarea mea eșuată de a potrivi datele serverului cu datele clientului. Ce s-a întâmplat? Multumesc

0
Da, ultimul lucru: Eroare la primirea datelor 10053.
adăugat autor pazduha, sursa
da nu am inclus acest bit de la client: if ((bytecount = recv (hsock, buffer, buffer_len, 0)) == SOCKET_ERROR) {
adăugat autor pazduha, sursa
Pentru a clarifica acest lucru, folosesc codul de mai sus și doc.qt. nokia.com/4.7-snapshot/…
adăugat autor pazduha, sursa
Ești sigur că conexiunea este stabilită corect? BTW în fragmentul pe care l-ați furnizat, atât serverul cât și clientul trimit, niciunul dintre ele nu primește.
adăugat autor Greg, sursa
Ce, exact, nu funcționează? Nu se conectează? Clientul primește date diferite decât se așteaptă?
adăugat autor Elliott, sursa

2 răspunsuri

Iată ceva care funcționează: (murdar)

void FortuneThread::run()
{

QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
    emit error(tcpSocket.error());
    cout<<"socket error"<<
0
adăugat

Nu am folosit socluri Qt, deci nu pot contribui mult la codul de server. Cu toate acestea, presupun că, din moment ce a provenit din eșantioane, ar trebui să fie corect.

Codul dvs. de client, OTOH, nu face o conexiune la server. Pentru un soclu TCP trebuie să

  1. create the socket - you're doing this
  2. connect to a peer socket using connect() - this is missing
  3. send the data using send() - you're doing this too

Ferește-te de modul în care specificați numerele porturilor. Dacă sunteți pe Windows, acesta utilizează endian puțin în timp ce comanda byte de rețea este în endian mare. Biblioteca socketurilor oferă htons() și ntohs() pentru a converti între cele două. Asigurați-vă că numărul de port pe care îl transmiteți pentru a conecta() (prin argumentul sockaddr_in *) este de aceeași ordine de octet ca și cel utilizat pentru crearea serverului Qt. Acest lucru este relevant și pentru adresa IP, dar mai puțin la o problemă, așa cum o utilizează tipic inet_addr ("xx.xx.xx.xx") pentru a converti un șir la DWORD IPv4 în ordinea corectă a byte-urilor.

În cele din urmă, rețineți că este posibil să nu primiți tot ce trimiteți într-o singură citire() la server. Serverele trebuie să tamponeze până când se întâlnește un marcator de sfârșit de mesaj (sau se citește lungimea prestabilită a mesajului).

HTH

0
adăugat