2012-06-04 37 views
0

我用winsock2.h發現了這個套接字代碼http://www.tidytutorials.com/2009/12/c-winsock-example-using-client-server.html這是我的客戶端的代碼。服務器winsock與QTcpServer之間的套接字交換

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

以上服務器的代碼是我失敗的嘗試,以配合客戶數據的服務器數據。哪裏不對? TY

+0

什麼,確切地說,不工作?它沒有連接嗎?客戶是否接收到與預期不同的數據? – Elliott

+0

是的,最後一件事:接收數據錯誤10053. – pazduha

+0

您確定連接建立正確嗎?順便說一句,你已經提供了服務器和客戶端都發送,他們都沒有收到。 – Greg

回答

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(); 
} 
1

我沒有使用Qt的插座所以難有作爲在服務器端代碼。但是,我假設它來自樣本應該是正確的。

您的客戶端代碼OTOH並未建立與服務器的連接。對於TCP套接字,你需要

  1. 創建套接字 - 你這樣做是
  2. 使用連接連接到一個對等端套接字() - 這是缺少
  3. 使用發送發送數據() - 你也這樣做

注意如何指定端口號。如果你在Windows上,它使用小端,而網絡字節順序是大端。套接字庫提供htons()和ntohs()在兩者之間進行轉換。確保您傳遞給connect()(通過sockaddr_in *參數)的端口號與用於創建Qt服務器的字節順序相同。這也與IP地址相關,但較少出現問題,因爲人們通常使用inet_addr(「xx.xx.xx.xx」)以正確的字節順序將字符串轉換爲IPv4 DWORD。

最後,請注意,您可能無法接收到您在服務器上的一個read()中發送的所有內容。服務器必須進行緩衝,直到遇到消息結束標記(或讀取預設的消息長度)。

HTH

相關問題