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 库提供了 htons() 和 ntohs() 来在两者之间进行转换。确保您传递给 connect() 的端口号(通过 sockaddr_in* 参数)与用于创建 Qt 服务器的字节顺序相同。这也与 IP 地址相关,但问题不大,因为通常使用 inet_addr("xx.xx.xx.xx") 以正确的字节顺序将字符串转换为 IPv4 DWORD。

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

高温高压

于 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 回答