2012-06-23 77 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

相关问题