2011-03-08 29 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