winsock& s之间的套接字交换QTcpServer既可

时间:2012-06-04 18:57:00

标签: c++ qt sockets tcp

我发现这个套接字代码有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 Class:

完成
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);

以上服务器代码是我尝试将服务器数据与客户端数据匹配失败。怎么了? TY

2 个答案:

答案 0 :(得分:1)

我没有使用Qt套接字,因此无法对服务器端代码做出太多贡献。但是,我假设它来自样本,它应该是正确的。

您的客户端代码OTOH未与服务器建立连接。对于TCP套接字,您需要

  1. 创建套接字 - 你正在做这个
  2. 使用connect()连接到对等套接字 - 缺少
  3. 使用send()发送数据 - 你也是这样做的
  4. 注意您如何指定端口号。如果你在Windows上,它使用小端,而网络字节顺序是大端。套接字库提供了htons()和ntohs()来在两者之间进行转换。确保传递给connect()的端口号(通过sockaddr_in *参数)与用于创建Qt服务器的字节顺序相同。这也与IP地址相关,但不是问题,因为通常使用inet_addr(“xx.xx.xx.xx”)以正确的字节顺序将字符串转换为IPv4 DWORD。

    最后,请注意您可能无法在服务器上的一个read()中收到您发送的所有内容。服务器必须进行缓冲,直到遇到消息结束标记(或读取预设的消息长度)。

    HTH

答案 1 :(得分: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();
}