2012-06-23 115 views
0

我正在用客戶端和服務器編寫一個小應用程序 - 客戶端發送一個問題,服務器回答。使用相同的套接字從服務器獲取響應?

我設法做了第一部分 - 服務器從客戶端獲取問題,做一些工作併發回答案。我只是不知道如何告訴客戶端等待來自服務器的響應。

這是我的客戶端代碼:

char* ipAddress = (char*)malloc(15); 
wcstombs(ipAddress, (TCHAR*)argv[1], 15); 
DWORD port = wcstod(argv[2], _T('\0')); 
DWORD numOfThreads = wcstod(argv[3], _T('\0;')); 
DWORD method = wcstod(argv[4], _T('\0;')); 

//initialize windows sockets service 
WSADATA wsaData; 
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
assert(iResult==NO_ERROR); 

//prepare server address 
sockaddr_in server_addr; 
server_addr.sin_family = AF_INET; 
server_addr.sin_addr.s_addr = inet_addr(ipAddress); 
server_addr.sin_port = htons(port); 

//create socket 
SOCKET hClientSocket= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
assert(hClientSocket!=INVALID_SOCKET); 

//connect to server 
int nRes=connect(hClientSocket, (SOCKADDR*)&server_addr, sizeof(server_addr)); 
assert(nRes!=SOCKET_ERROR); 

char* buf = "GET /count.htm HTTP/1.1\r\nHost: 127.0.0.1:666\r\nAccept: text/html,application/xhtml+xml\r\nAccept-Language: en-us\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent: Mozilla/5.0\r\n\r\n"; 

int nBytesToSend= strlen(buf); 
int iPos=0; 

while(nBytesToSend) 
{ 
    int nSent=send(hClientSocket,buf,nBytesToSend,0); 
    assert(nSent!=SOCKET_ERROR); 

    nBytesToSend-=nSent; 
    iPos+=nSent; 
} 

closesocket(hClientSocket); 

int nLen = sizeof(server_addr); 
SOCKET hRecvSocket=accept(hClientSocket,(SOCKADDR*)&server_addr, &nLen); 
assert(hRecvSocket!=INVALID_SOCKET); 

//prepare buffer for incoming data 
char serverBuff[256]; 
int nLeft=sizeof(serverBuff); 
iPos=0; 

do //loop till there are no more data 
{ 
    int nNumBytes=recv(hRecvSocket,serverBuff+iPos,nLeft,0); 

    //check if cleint closed connection 
    if(!nNumBytes) 
     break; 

    assert(nNumBytes!=SOCKET_ERROR); 

    //update free space and pointer to next byte 
    nLeft-=nNumBytes; 
    iPos+=nNumBytes; 

}while(1); 

SOCKET hRecvSocket=accept(hClientSocket,(SOCKADDR*)&server_addr, &nLen);線路出現故障後的說法。

回答

1

您的「發送」循環後,closesocket和接受呼叫 - 刪除這些呼叫。接受是服務器偵聽傳入連接,而不是已連接的客戶端。

在send()循環完成後,直接進入recv()循環。這應該解決您的直接問題:

另外,您的發送循環忘記在緩衝區中引用iPos,就像我認爲您打算的那樣。這是你想要的東西:

int nSent=send(hClientSocket,buf+iPos,nBytesToSend,0); 

在網絡編程,插座將無法因無法控制的網絡條件。因此,在網絡電話上「斷言」並不總是合適的。最好只是期望失敗並做好準備處理它。通常,關閉套接字和活動連接是處理大多數錯誤的方法。

+0

工作很好 - 謝謝! – YogevSitton

相關問題