0

winsock2.h でこのソケット コードを見つけましたhttp://www.tidytutorials.com/2009/12/c-winsock-example-using-client-server.htmlこれは私のクライアントのコードです。

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){

サーバーのコードは Qt QTcpServer クラスで行われます:

void FortuneThread::run()
   {
   QTcpSocket tcpSocket;
   if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
       emit error(tcpSocket.error());
       cout<<"socket error"<<endl;
       return;
    }

    char buffer[1024];
    int buffer_len = 1024;
    memset(buffer, 0, buffer_len);
    strcat(buffer, " SERVER ECHO");

    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << &socketDescriptor;
    out << buffer;
    out << strlen(buffer);
    out << 0;

    tcpSocket.write(block);

上記のサーバー コードは、サーバー データとクライアント データを一致させようとして失敗したものです。なにが問題ですか?タイ

4

2 に答える 2

1

私はQtソケットを使用したことがないので、サーバー側のコードにあまり貢献できません。しかし、それはサンプルからのものなので、正しいはずだと思います。

クライアントコードOTOHは、サーバーに接続しません。TCPソケットの場合、次のことを行う必要があります

  1. ソケットを作成します-あなたはこれをやっています
  2. connect()を使用してピアソケットに接続します-これはありません
  3. send()を使用してデータを送信します-これも実行しています

ポート番号の指定方法に注意してください。Windowsを使用している場合、ネットワークバイトオーダーがビッグエンディアンであるのに対し、リトルエンディアンを使用します。Socketsライブラリは、2つの間で変換するためのhtons()とntohs()を提供します。connect()に(sockaddr_in *引数を介して)渡すポート番号が、Qtサーバーの作成に使用されるものと同じバイトオーダーであることを確認してください。これはIPアドレスにも関係しますが、通常はinet_addr( "xx.xx.xx.xx")を使用して文字列を正しいバイト順序でIPv4 DWORDに変換するため、問題は少なくなります。

最後に、サーバーで1回のread()で送信したすべてを受信できない場合があることに注意してください。サーバーは、メッセージの終わりマーカーが検出されるまで(または、事前設定された長さのメッセージが読み取られるまで)バッファリングを実行する必要があります。

HTH

于 2012-06-05T02:34:17.113 に答える
0

これが機能するものです:(乱雑)

void FortuneThread::run()
{

QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
    emit error(tcpSocket.error());
    cout<<"socket error"<<endl;
    return;
}
//in part
tcpSocket.waitForReadyRead(10000);
int joj = tcpSocket.bytesAvailable();
char inbuffer[1024];
tcpSocket.read(inbuffer,1024);
string instring;
instring = inbuffer;
instring.resize(joj);
cout<<instring<<endl;

//out part
char buffer[1024];
int buffer_len = 1024;
int bytecount;

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


string outstring = "hey client!";
    int TempNumOne=outstring.size();

    for (int a=0;a<TempNumOne;a++)
    {
        buffer[a]=outstring[a];
    }

QByteArray block;
block = buffer;


tcpSocket.write(block);
tcpSocket.disconnectFromHost();
tcpSocket.waitForDisconnected();
}
于 2012-06-05T02:10:22.453 に答える