C++ winsock与&;之间的套接字交换;qtcserver

C++ winsock与&;之间的套接字交换;qtcserver,c++,qt,sockets,tcp,C++,Qt,Sockets,Tcp,我在winsock2中找到了这个套接字代码。这是我客户端的代码 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++){

我在winsock2中找到了这个套接字代码。这是我客户端的代码

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);
void FortuneThread::run()
{
QTcpSocket-tcpSocket;
如果(!tcpSocket.setSocketDescriptor(socketDescriptor)){
发出错误(tcpSocket.error());

cout这里有一些有用的东西:(凌乱)

void FortuneThread::run()
{
QTcpSocket-tcpSocket;
如果(!tcpSocket.setSocketDescriptor(socketDescriptor)){
发出错误(tcpSocket.error());

cout我没有使用Qt套接字,因此在服务器端代码上贡献不大。但是,我假设,由于它来自示例,所以应该是正确的

您的客户端代码OTOH没有连接到服务器。对于TCP套接字,您需要

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

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


    HTH

    确切地说,什么东西不起作用?它没有连接吗?客户端接收到的数据是否与预期的不同?是的,最后一件事:接收数据时出错10053。您确定,该连接建立正确吗?顺便说一句,在您提供的代码段中,服务器和客户端都在发送,没有一个在接收。是的,我没有包括此bi来自客户端的t:if((bytecount=recv(hsock,buffer,buffer_len,0))==SOCKET_ERROR){为了明确起见,我使用的代码来自上面的链接和
    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();
    }