2011-03-08 26 views
-1

下面是我從MSDN的Winsock服務器編程示例中獲取的代碼。代碼似乎工作正常。當我在瀏覽器中輸入http:// localhost:27015時,代碼會作出適當的響應。但是,我無法使用瀏覽器發送的字符串作爲請求,並將其作爲字符數組存儲在recvbuf中。例如,我無法使用printf緩衝區,也不能使用fwrite。該程序立即終止。請幫忙。recv() - 使用HTTP標頭

#undef UNICODE 

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 


// Need to link with Ws2_32.lib 
#pragma comment (lib, "Ws2_32.lib") 
// #pragma comment (lib, "Mswsock.lib") 

#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "27015" 

int __cdecl main(void) 
{ 
WSADATA wsaData; 
SOCKET ListenSocket = INVALID_SOCKET, 
     ClientSocket = INVALID_SOCKET; 
struct addrinfo *result = NULL, 
       hints; 
char recvbuf[DEFAULT_BUFLEN]; 
char *sendbuf = "HTTP/1.1 200 OK \r\n Date: Fri, 31 Dec 1999 23:59:59 GMT \r\n Content-  Type: text/html\r\n"; 
int iResult, iSendResult; 
int recvbuflen = DEFAULT_BUFLEN; 

// Initialize Winsock 
iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
if (iResult != 0) { 
    printf("WSAStartup failed with error: %d\n", iResult); 
    return 1; 
} 
else 
    printf("\nInitialising winsock...done"); 

ZeroMemory(&hints, sizeof(hints)); 
hints.ai_family = AF_INET; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_protocol = IPPROTO_TCP; 
hints.ai_flags = AI_PASSIVE; 

// Resolve the server address and port 
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); 
if (iResult != 0) { 
    printf("getaddrinfo failed with error: %d\n", iResult); 
    WSACleanup(); 
    return 1; 
} 
else 
    printf("\nResolving server address...done"); 
//localhost:27015/ 
// Create a SOCKET for connecting to server 
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); 
if (ListenSocket == INVALID_SOCKET) { 
    printf("socket failed with error: %ld\n", WSAGetLastError()); 
    freeaddrinfo(result); 
    WSACleanup(); 
    return 1; 
} 
else 
    printf("\nCreating connection socket...done"); 

// Setup the TCP listening socket 
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); 
if (iResult == SOCKET_ERROR) { 
    printf("bind failed with error: %d\n", WSAGetLastError()); 
    freeaddrinfo(result); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 
else 
    printf("\nCreating listening socket...done"); 
    printf("\nWaiting for connection... "); 

freeaddrinfo(result); 

iResult = listen(ListenSocket, SOMAXCONN); 
if (iResult == SOCKET_ERROR) { 
    printf("listen failed with error: %d\n", WSAGetLastError()); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 

// Accept a client socket 
ClientSocket = accept(ListenSocket, NULL, NULL); 
if (ClientSocket == INVALID_SOCKET) { 
    printf("accept failed with error: %d\n", WSAGetLastError()); 
    closesocket(ListenSocket); 
    WSACleanup(); 
    return 1; 
} 

// No longer need server socket 
closesocket(ListenSocket); 

// Receive until the peer shuts down the connection 
do 
{ 
    iResult = recv(ClientSocket, recvbuf, recvbuflen,0); 
    if (iResult > 0) { 
     printf("Bytes received: %d\n", iResult); 

     // Echo the buffer back to the sender 
     iSendResult = send(ClientSocket,sendbuf,(int)strlen(sendbuf), 0); 
     if (iSendResult == SOCKET_ERROR) { 
      printf("send failed with error: %d\n", WSAGetLastError()); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return 1; 
     } 
     printf("Bytes sent: %d\n", iSendResult); 
    } 
    else if (iResult == 0) 
     printf("Connection closing...\n"); 
    else { 
     printf("recv failed with error: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
     return 1; 
    } 
}while(iResult>0); 

// shutdown the connection since we're done 
iResult = shutdown(ClientSocket, SD_SEND); 
if (iResult == SOCKET_ERROR) { 
    printf("shutdown failed with error: %d\n", WSAGetLastError()); 
    closesocket(ClientSocket); 
    WSACleanup(); 
    return 1; 
} 
// cleanup 
closesocket(ClientSocket); 
WSACleanup(); 
//Appended later 
printf("\n"); 
int i =0; 
while(i<120) 
{ 
    printf("%c",recvbuf[i]); 
    ++i; 
} 
return 0; 

}

謝謝!

+0

我沒有看到你試圖用recvbuf做什麼,什麼代碼確實失敗了? – Erik 2011-03-08 18:26:04

+0

請參閱OP中的編輯版本。 (上面的六行返回0.)當瀏覽器連接到服務器時程序終止。沒有提到錯誤。 – check123 2011-03-09 14:54:20

回答

-1

添加以下功能的幫助。 Maxim提供的暗示是

通過recv()收到的數據不是 以零終止。

void handleBuffer() 
{ 
    recvbuf[DEFAULT_BUFLEN-1]='\0'; 
    printf("*********************\n"); 
    printf("%s",recvbuf); 
} 

我也增加了我的DEFAULT_BUFLEN 4096調用函數隨時打印輸出。

+0

帶有星號的printf僅用於隔離目的。 – check123 2011-03-09 15:08:21

2
iResult = recv(ClientSocket, recvbuf, recvbuflen,0); 

在上面,通過recv()收到的數據不是零終止的。 iResult是數據的長度,以將其輸出作爲文本:

printf("%.*s", iResult, recvbuf); 
+0

嗨,這個也沒有幫助。 – check123 2011-03-09 14:54:47