Μετάβαση στο κύριο περιεχόμενο
Υποστήριξη
Είσοδος με Microsoft
Είσοδος ή δημιουργία λογαριασμού.
Γεια σας,
Επιλέξτε διαφορετικό λογαριασμό.
Έχετε πολλούς λογαριασμούς
Επιλέξτε τον λογαριασμό με τον οποίο θέλετε να εισέλθετε.

Σύνοψη

Ορισμένες φορές πρέπει να στέλνετε επείγοντα δεδομένα εκτός εύρους (OOB) στους δέκτες σας. Οι δέκτες είναι οποιοιδήποτε χρήστες ή οποιεσδήποτε εφαρμογές που λαμβάνουν τα δεδομένα. Θέλετε αυτά τα δεδομένα του OOB να αντιμετωπίζονται ως δεδομένα υψηλότερης προτεραιότητας από τα κανονικά δεδομένα που μπορείτε να στείλετε. Εάν τα δεδομένα του OOB που θέλετε να στείλετε είναι ένα byte, μπορείτε να χρησιμοποιήσετε τη συνάρτηση Select για να ΑΝΑΖΗΤΉΣΕΤΕ δεδομένα OOB. Μπορείτε να χρησιμοποιήσετε τη συνάρτηση recv για να διαβάσετε τα δεδομένα. Ωστόσο, στο πρωτόκολλο ελέγχου μετάδοσης (TCP), το μπλοκ δεδομένων OOB είναι πάντα ένα byte. Επομένως, εάν στείλετε δεδομένα OOB πολλών byte, ανακτάται μόνο το τελευταίο byte των δεδομένων OOB. Τα υπόλοιπα δεδομένα αντιμετωπίζονται ως κανονικά δεδομένα. Αυτό το άρθρο χρησιμοποιεί δείγμα κώδικα για να περιγράψει τον τρόπο με τον οποίο μπορείτε να στείλετε δεδομένα OOB πολλών byte χρησιμοποιώντας την υποδοχή των Microsoft Windows (Winsock).

ΣΕ ΑΥΤΗΝ ΤΗΝ ΕΡΓΑΣΙΑ

ΕΙΣΑΓΩΓΗ

Αυτό το άρθρο περιγράφει τον τρόπο με τον οποίο μπορείτε να στείλετε δεδομένα εκτός ζώνης πολλών byte (Chars) χρησιμοποιώντας το Winsock. Τα δείγματα εφαρμογών δημιουργούνται στο Microsoft Visual C++. Επειδή αυτός ο μηχανισμός OOB δεν υποστηρίζεται άμεσα στο επίπεδο υποδοχής των Microsoft Windows, πρέπει να υλοποιήσετε αυτόν το μηχανισμό OOB σε επίπεδο εφαρμογής. Αυτό δεν είναι αληθές OOB δεδομένων. Σε αυτό το δείγμα εφαρμογής, δημιουργείτε δύο υποδοχές στην πλευρά του προγράμματος-πελάτη, γνωστές και ως πλευρά του αποστολέα, για την αποστολή δεδομένων OOB και κανονικών δεδομένων. Στην πλευρά του διακομιστή, γνωστή και ως πλευρά του δέκτη, μπορείτε να χρησιμοποιήσετε δύο υποδοχές για να επεξεργαστείτε τα δεδομένα σε δύο νήματα. Ένα νήμα είναι για τα δεδομένα OOB. Το άλλο νήμα είναι για τα κανονικά δεδομένα. Για να προσομοιώσετε το μηχανισμό OOB, πρέπει να συγχρονίσετε αυτά τα δύο νήματα. Βεβαιωθείτε ότι το νήμα που επεξεργάζεται δεδομένα OOB έχει υψηλότερη προτεραιότητα από το νήμα που επεξεργάζεται τα κανονικά δεδομένα.Σημείωση Αυτό το δείγμα εφαρμογής περιγράφει έναν τρόπο για την αποστολή δεδομένων OOB πολλών byte. Ίσως χρειαστεί να αναθεωρήσετε τον κώδικα για να κάνετε τον κώδικα να λειτουργεί στο περιβάλλον σας.επιστροφή στην αρχή

Δημιουργία εφαρμογής προγράμματος-πελάτη

  1. Δημιουργήστε μια εφαρμογή προγράμματος-πελάτη. Σε αυτήν την εφαρμογή προγράμματος-πελάτη, το ακόλουθο δείγμα κώδικα περιγράφει τον τρόπο δημιουργίας δύο υποδοχών:

    SOCKET myOOBSocket = INVALID_SOCKET;SOCKET myNormalSocket = INVALID_SOCKET;myOOBSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);myNormalSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    Η μεταβλητή myOOBSocket χρησιμοποιείται για την αποστολή δεδομένων OOB. Η μεταβλητή myNormalSocket χρησιμοποιείται για την αποστολή κανονικών δεδομένων.

  2. Επειδή τα δεδομένα που στέλνει η μεταβλητή myOOBSocket δεν είναι αληθή OOB δεδομένα, πρέπει να έχετε έναν τρόπο να πείτε στο διακομιστή τι είδους δεδομένα πρέπει να στείλει η υποδοχή πριν να ξεκινήσετε την αποστολή δεδομένων. Το παρακάτω δείγμα κώδικα περιγράφει τον τρόπο με τον οποίο μπορείτε να στείλετε έναν αρχικό χαρακτήρα για να ειδοποιήσετε το διακομιστή σχετικά με το είδος των δεδομένων που θα αποσταλούν. Χρησιμοποιήστε το "U" για τα δεδομένα OOB και χρησιμοποιήστε το "N" για τα κανονικά δεδομένα.

    int nErr, nSize;nErr = connect(myNormalSocket, (SOCKADDR *)&remoteIp, sizeof(remoteIp));//Look for a potential error here.//"remoteIp" is the remote address.nSize = send(myNormalSocket, "N",1, 0);//Look for a potential error here.nErr = connect(myOOBSocket, (SOCKADDR *)&remoteIp, sizeof(remoteIp));//Look for a potential error here.nSize = send(myOOBSocket,"U",1, 0);//Look for a potential error here.
  3. Το παρακάτω δείγμα κώδικα περιγράφει τον τρόπο με τον οποίο μπορείτε να κάνετε την εφαρμογή-πελάτη να παρακολουθεί την είσοδο από το χρήστη. Η εφαρμογή-πελάτης αποστέλλει κεφαλαίους χαρακτήρες ως δεδομένα OOB. Δημιουργήστε διπλότυπο κάθε χαρακτήρα εισόδου για να συντάξετε μια συμβολοσειρά πολλών byte.

    for (;;) {int ch = _getch();_putch( ch );if (ch=='.') {shutdown(myOOBSocket, 2);        shutdown(myNormalSocket,2);break;}        char buf[10];        memset(buf, ch, sizeof(buf));        if (isupper(ch)) {nSize = send(myOOBSocket, buf, sizeof(buf), 0);//Do not use the MSG_OOB flag. Send it as normal data.} else {nSize = send(myNormalSocket, buf, sizeof(buf), 0);}...}

Εμφάνιση του δείγματος κώδικα για την εφαρμογή-πελάτη, Myclient. cpp Επιστροφή στην κορυφή

Δημιουργία εφαρμογής διακομιστή

  1. Στην πλευρά του διακομιστή, το παρακάτω δείγμα κώδικα περιγράφει τον τρόπο δημιουργίας μιας υποδοχής ακρόασης για την παρακολούθηση της θύρας που χρησιμοποιείται για την επικοινωνία:

    int nErr;SOCKET myListener = INVALID_SOCKET;myListener = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//Look for a potential return error here.nErr = bind(myListener,(SOCKADDR *)&localIp,sizeof(localIp));//Look for a potential return error here.//"localIp" is the local address of the server.nErr = listen(myListener, 5);//Look for a potential return error here.
  2. Το παρακάτω δείγμα κώδικα περιγράφει τον τρόπο με τον οποίο μπορείτε να καλείτε τη συνάρτηση Accept για να περιμένει η υποδοχή ακρόασης για την εισερχόμενη σύνδεση:

    for (;;) {struct sockaddr_in remoteIp;SOCKET remoteSocket = INVALID_SOCKET;int nAddrLen = sizeof(SOCKADDR);remoteSocket = accept(myListener, (SOCKADDR *)(&remoteIp), &nAddrLen);//"remoteIp" is a pointer to a buffer that receives //the address of the connecting entity.BYTE buffer[1+1];int recv_len=recv(remoteSocket,(char *)&buffer,1,0);//This supposes that the client sockets will send//"U" or "N" as the initial character.    buffer[recv_len] = '\0';if(strcmp((char *)buffer,"U")==0)hThread=CreateThread(0,0,OOBHandler,(LPVOID)remoteSocket, 0, &dwThreadId);//Create a new thread to process incoming OOB data. "OOBHandler" is a //pointer to the OOB data handler. else if(strcmp((char *)buffer,"N")==0)hThread=CreateThread(0,0,NormalHandler,(LPVOID)remoteSocket, 0, &dwThreadId);//Create a new thread to process incoming normal data. "NormalHandler" is //a pointer to the normal data handler....}
  3. Για να προσομοιώσετε το μηχανισμό OOB, πρέπει να συγχρονίσετε αυτά τα δύο νήματα. Σε αυτό το δείγμα εφαρμογής, χρησιμοποιήστε ένα αντικείμενο καθολικού συμβάντος για να το κάνετε αυτό. Τοποθετήστε την παρακάτω πρόταση στο επάνω μέρος του αρχείου.

    //Create a manual-reset event object. hRecvEvent=CreateEvent(NULL,TRUE,TRUE,"RecvEvent");
  4. Δημιουργήστε το πρόγραμμα χειρισμού OOB που εκτελείται από ένα ξεχωριστό νήμα. Σε αυτό το πρόγραμμα χειρισμού, μπορείτε να χρησιμοποιήσετε τη συνάρτηση Select για να ανιχνεύσετε πότε φτάνουν τα δεδομένα. Όταν φτάνουν τα δεδομένα, ακολουθήστε τα παρακάτω βήματα:

    1. Να καλείτε τη συνάρτηση ResetEvent για να ορίζετε το αντικείμενο συμβάντος hRecvEvent σε κατάσταση χωρίς σήμα.

      ResetEvent(hRecvEvent);

      Αυτό αποκλείει το πρόγραμμα χειρισμού κανονικών δεδομένων που εκτελείται σε άλλο νήμα.

    2. Ονομάστε τη συνάρτηση revc για να διαβάσετε τα δεδομένα.

      recv(remoteSocket,(char *)&buffer,sizeof(buffer) - 1,0);
    3. Επειδή μπορεί να αποσταλούν περισσότερα δεδομένα από αυτά που μπορεί να κρατήσει το buffer, επικοινωνήστε ξανά με τη συνάρτηση recv , μαζί με τη σημαία MSG_PEEK , για να προσδιορίσετε εάν υπάρχουν διαθέσιμα δεδομένα στο καλώδιο.

      recv(remoteSocket,(char *)&buffer,sizeof(buffer)-1,MSG_PEEK);

      Χρησιμοποιήστε μία από τις ακόλουθες μεθόδους, ανάλογα με το εάν υπάρχουν δεδομένα που εκκρεμούν για ανάγνωση ή όχι:

      • Εάν δεν εκκρεμεί κανένα δεδομένο για ανάγνωση, επικοινωνήστε με τη συνάρτηση SetEvent για να καθορίσετε το καθορισμένο αντικείμενο συμβάντος στην κατάσταση με το σήμα.

        SetEvent(hRecvEvent);

        Όταν το κάνετε αυτό, μπορεί να συνεχιστεί το νήμα του κανονικού δείκτη χειρισμού δεδομένων. Το νήμα του προγράμματος χειρισμού κανονικών δεδομένων αναμένει το αντικείμενο συμβάντος hRecvEvent πριν από την επαναφορά του νήματος του κανονικού προγράμματος χειρισμού δεδομένων.

      • Εάν εξακολουθεί να εκκρεμεί η ανάγνωση δεδομένων, επικοινωνήστε ξανά με τη συνάρτηση recv για να διαβάσετε τα υπόλοιπα δεδομένα. Στη συνέχεια, αναζητήστε ξανά τα δεδομένα που εκκρεμούν.

    Επαναλάβετε τα βήματα 4α έως 4C μέχρι να διαβαστεί όλα τα δεδομένα που εκκρεμούν.

  5. Δημιουργήστε το πρόγραμμα χειρισμού κανονικών δεδομένων. Αυτός ο δείκτης χειρισμού είναι παρόμοιος με το πρόγραμμα χειρισμού δεδομένων OOB, εκτός από το ότι το πρόγραμμα χειρισμού κανονικών δεδομένων καλεί τη συνάρτηση WaitForSingleObject , όταν το πρόγραμμα χειρισμού κανονικών δεδομένων εντοπίζει ότι τα δεδομένα έχουν φθάσει.

    WaitForSingleObject(hRecvEvent,INFINITE);//You can set the interval parameter to a specific value if you do not want  //the normal data handler to wait for the OOB handler indefinitely when OOB data arrives continuously.

Εμφάνιση του δείγματος κώδικα για την εφαρμογή διακομιστή, MyServer. cpp Επιστροφή στην κορυφή

Εμφάνιση του δείγματος κώδικα για την εφαρμογή-πελάτη, Myclient. cpp

Σημείωση Πρέπει να συμπεριλάβετε μια αναφορά στο αρχείο βιβλιοθήκης του Winsock, Ws2_32. lib, για να κάνετε τον κώδικα να μεταγλωττιστεί.

#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <assert.h>#include <winsock.h>main(int argc, char *argv[]){int nErr, nSize;WSADATA wsaData;SOCKET myOOBSocket = INVALID_SOCKET;SOCKET myNormalSocket = INVALID_SOCKET;unsigned short nPort; // Listen for the port number.struct sockaddr_in remoteIp;if (argc!=3){printf("TcpDemoC <RemoteIp> <Port>\n");return 0;}// The Init Socket API.nErr = WSAStartup(MAKEWORD(1,1),&wsaData);assert(nErr==0);nPort = (unsigned short)atol(argv[2]);myOOBSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);assert(myOOBSocket!=INVALID_SOCKET);myNormalSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);assert(myNormalSocket!=INVALID_SOCKET);// Connect to the remote address.remoteIp.sin_family = AF_INET;remoteIp.sin_port = htons(nPort);;remoteIp.sin_addr.S_un.S_addr = inet_addr(argv[1]);nErr = connect(myOOBSocket, (SOCKADDR *)&remoteIp, sizeof(remoteIp));if (nErr == SOCKET_ERROR) {printf("Connect failed because of %lX\n",  WSAGetLastError());goto Cleanup;}nSize = send(myOOBSocket,"U",1, 0);if (nSize == SOCKET_ERROR) {printf("Send failed because of %lX\n", WSAGetLastError());        goto Cleanup;}    nErr = connect(myNormalSocket, (SOCKADDR *)&remoteIp, sizeof(remoteIp));if (nErr == SOCKET_ERROR) {int error = WSAGetLastError();printf("Connect failed because of %lX\n", error);goto Cleanup;}    nSize = send(myNormalSocket, "N",1, 0);if (nSize == SOCKET_ERROR) {printf("Send failed because of %lX\n", WSAGetLastError());goto Cleanup;}printf("Read for input:\n");for (;;) {int ch = _getch();_putch( ch );if (ch=='.') {shutdown(myOOBSocket, 2);shutdown(myNormalSocket,2);break;}char buf[10];memset(buf, ch, sizeof(buf));if (isupper(ch)) {nSize = send(myOOBSocket, buf, sizeof(buf), 0);}else{nSize = send(myNormalSocket, buf, sizeof(buf), 0);}if (nSize == SOCKET_ERROR) {printf("Send failed because of %lX\n", WSAGetLastError());break;}}Sleep(1000);Cleanup:if (myOOBSocket!=INVALID_SOCKET)closesocket(myOOBSocket);if (myNormalSocket!=INVALID_SOCKET)closesocket(myNormalSocket);WSACleanup();return 0;}

επιστροφή στην αρχή

Εμφάνιση του δείγματος κώδικα για την εφαρμογή διακομιστή, MyServer. cpp

Σημείωση Πρέπει να συμπεριλάβετε μια αναφορά στο αρχείο βιβλιοθήκης του Winsock, Ws2_32. lib, για να κάνετε τον κώδικα να μεταγλωττιστεί.

#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <winsock.h>#include <assert.h>// Usage: myserver <port>HANDLE hRecvEvent; DWORD WINAPI OOBHandler(LPVOID lpParam){int nErr, nRecv_len;BYTE buffer[10 + 1];BOOL bClosing=FALSE;fd_set fdread;SOCKET remoteSocket=(SOCKET)lpParam;unsigned long ul=1;int nRet = ioctlsocket(remoteSocket, FIONBIO, &ul);if(SOCKET_ERROR==nRet){printf("Socket() failed: %d\n", WSAGetLastError());return 1;}printf("Waiting");for (int i=0; i<10; i++) {printf(".");Sleep(1000);}printf("The OOB handler is ready!\n");while (!bClosing){//Always clear the set before you call the select method.FD_ZERO(&fdread);//Add sockets to the sets.FD_SET(remoteSocket, &fdread);nErr=select(0,&fdread,0,0,0);if(nErr==SOCKET_ERROR){printf("Select() failed: %d\n",WSAGetLastError());return 1;}if(FD_ISSET(remoteSocket,&fdread)){ResetEvent(hRecvEvent);while(1){nRecv_len=recv(remoteSocket,(char *)&buffer,sizeof(buffer) - 1,0);                    if(nRecv_len==0){bClosing=TRUE;printf("The connection is closed!\n");break;}buffer[nRecv_len] = '\0';printf("[OOB]: %s\n", buffer);                    nRecv_len=recv(remoteSocket,(char *)&buffer,sizeof(buffer)-1,MSG_PEEK);if (nRecv_len==SOCKET_ERROR) {if(WSAGetLastError()==WSAEWOULDBLOCK)break;elseprintf("Recv() failed. Win32 error is 0x%lx\n", WSAGetLastError());}}SetEvent(hRecvEvent);} }return 0;}DWORD WINAPI NormalHandler(LPVOID lpParam){int nErr,nRecv_len;BYTE buffer[10 + 1];fd_set fdread;SOCKET remoteSocket=(SOCKET)lpParam;printf("Waiting");for (int i=0; i<10; i++) {        printf("*");Sleep(1000);}printf("Normal handler ready!\n");while(1) {//Always clear the set before you call the select method.FD_ZERO(&fdread);//Add sockets to the sets.FD_SET(remoteSocket, &fdread);nErr=select(0,&fdread,0,0,0);if(nErr==SOCKET_ERROR){printf("Select() failed: %d\n",WSAGetLastError());return 1;}if(FD_ISSET(remoteSocket,&fdread)){WaitForSingleObject(hRecvEvent,INFINITE);nRecv_len=recv(remoteSocket,(char *)&buffer,sizeof(buffer) - 1,0);            if (nRecv_len==SOCKET_ERROR) {printf("Recv() failed. Win32 error is 0x%lx\n", WSAGetLastError());return 1;}            if(nRecv_len==0){printf("Connection Closed!\n");break;}       buffer[nRecv_len] = '\0';printf("[Normal]: %s\n", buffer);}}return 0;}int main(int argc, char *argv[]){WSADATA wsaData;int nErr;SOCKET myListener = INVALID_SOCKET;struct sockaddr_in localIp;unsigned short nPort; DWORD dwThreadId;HANDLE hThread=NULL;if (argc!=2){printf("MyServer <Port>\n");return 0;}nPort = (unsigned short)atol(argv[1]);nErr = WSAStartup(MAKEWORD(2,0),&wsaData);assert(nErr==0);assert(wsaData.wVersion == MAKEWORD(2,0));myListener = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);assert(myListener!=INVALID_SOCKET);// Bind the listen socket to any local IP address.localIp.sin_family = AF_INET;localIp.sin_port = htons(nPort);;localIp.sin_addr.S_un.S_addr = INADDR_ANY;nErr = bind(myListener,(SOCKADDR *)&localIp,sizeof(localIp));assert(nErr!=SOCKET_ERROR);nErr = listen(myListener, 5);assert(nErr==0);//Create a manual-reset event object. hRecvEvent=CreateEvent(NULL,TRUE,TRUE,"RecvEvent");if (hRecvEvent == NULL) { printf("CreateEvent failed with error 0x%lx\n", GetLastError());return 1;}printf("The server is ready!\n");for (;;) {struct sockaddr_in remoteIp;SOCKET remoteSocket = INVALID_SOCKET;int nAddrLen = sizeof(SOCKADDR);remoteSocket = accept(myListener, (SOCKADDR *)(&remoteIp), &nAddrLen);if(remoteSocket == INVALID_SOCKET) {int error = WSAGetLastError();printf("Accept() failed. Win32 error is 0x%lx\n", GetLastError());goto Cleanup;} else {printf("Connected from %d.%d.%d.%d:%d\n", remoteIp.sin_addr.S_un.S_un_b.s_b1,remoteIp.sin_addr.S_un.S_un_b.s_b2,remoteIp.sin_addr.S_un.S_un_b.s_b3,remoteIp.sin_addr.S_un.S_un_b.s_b4,ntohs(remoteIp.sin_port));BYTE buffer[1+1];int nRecv_len=recv(remoteSocket,(char *)&buffer,1,0);if (nRecv_len==SOCKET_ERROR) {printf("Recv() failed. Win32 error is 0x%lx\n", WSAGetLastError());return 1;}    buffer[nRecv_len] = '\0';if(strcmp((char *)buffer,"U")==0)hThread=CreateThread(0,0,OOBHandler,(LPVOID)remoteSocket, 0, &dwThreadId);else if(strcmp((char *)buffer,"N")==0)hThread=CreateThread(0,0,NormalHandler,(LPVOID)remoteSocket, 0, &dwThreadId);           if(hThread==0){printf("CreateThread() failed: %d\n",GetLastError());return 1;}CloseHandle(hThread);}}closesocket(myListener);Cleanup:WSACleanup();return 0;}

επιστροφή στην αρχή

Δοκιμή του δείγματος

  1. Στη γραμμή εντολών, πληκτρολογήστε MyServer. exe 4444 για να ξεκινήσετε το διακομιστή στη θύρα 4444. η εφαρμογή διακομιστή εμφανίζει το ακόλουθο μήνυμα και, στη συνέχεια, αναμένει για προγράμματα-πελάτες:

    Ο διακομιστής είναι έτοιμος!

  2. Σε ένα διαφορετικό παράθυρο γραμμής εντολών, πληκτρολογήστεMyClient διεύθυνση IP 4444 για να ξεκινήσετε το πρόγραμμα-πελάτη. Σημείωση Το σύμβολο κράτησης θέσης διεύθυνση IP είναι ένα σύμβολο κράτησης θέσης για τη διεύθυνση IP του διακομιστή.

  3. Ο διακομιστής εμφανίζει ένα μήνυμα παρόμοιο με το εξής:

    Waiting.Waiting*..*Όταν λάβετε το προηγούμενο μήνυμα, πρέπει να πληκτρολογήσετε aBcDeFgHi στο πρόγραμμα-πελάτη εντός 10 δευτερολέπτων πριν να συνεχιστεί ο διακομιστής.

Μετά από περίπου 10 δευτερόλεπτα, ο διακομιστής εμφανίζει τα εξής:

[OOB]: BBBBBBBBBB [OOB]: DDDDDDDDDD [OOB]: FFFFFFFFFF [OOB]: HHHHHHHHHH [Normal]: aaaaaaaaaa [Normal]: cccccccccc [Normal]: eeeeeeeeee [Normal]: gggggggggg [Normal]: iiiiiiiiiiεπιστροφή στην αρχή

Αναφορές

Για περισσότερες πληροφορίες, επισκεφθείτε τις ακόλουθες τοποθεσίες Web του Microsoft Developer Network (MSDN):

Πρωτόκολλα-ανεξάρτητες συναρτήσειςhttp://msdn2.Microsoft.com/en-US/Library/ms740102.aspxδεδομένων εκτός εύρους δεδομένων του Winsockhttp://msdn2.Microsoft.com/en-US/Library/ms741394.aspxΓια πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

331756 Η συνάρτηση Ioctlsocket δεν μπορεί να ανιχνεύσει ενσωματωμένα δεδομένα εκτός εύρους ζώνηςΕπιστροφή στην κορυφή

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.

Οι κοινότητες σάς βοηθούν να κάνετε και να απαντάτε σε ερωτήσεις, να δίνετε σχόλια και να ακούτε από ειδικούς με πλούσια γνώση.

Σας βοήθησαν αυτές οι πληροφορίες;

Πόσο ικανοποιημένοι είστε με τη γλωσσική ποιότητα;
Τι επηρέασε την εμπειρία σας;
Πατώντας "Υποβολή" τα σχόλια σας θα χρησιμοποιηθούν για τη βελτίωση των προϊόντων και των υπηρεσιών της Microsoft. Ο διαχειριστής IT θα έχει τη δυνατότητα να συλλέξει αυτά τα δεδομένα. Δήλωση προστασίας προσωπικών δεδομένων.

Σας ευχαριστούμε για τα σχόλιά σας!

×