2013-10-18 26 views
-2

读我写使用套接字编程和C.分段故障从HTTP插座

我有正从Web服务器的HTTP响应的问题一个简单的代理。当我运行这段代码并尝试访问cisco.com网站时,我的程序给我一个段错误错误。

#include <netinet/in.h> 
#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <sys/socket.h> 
#include <netdb.h> 
int main() 
{ 
    int serverSocket; 
    char ip[INET_ADDRSTRLEN]; 
    int i; 
    int j; 
    serverSocket = socket(AF_INET, SOCK_STREAM, 0); 
    struct sockaddr_in serverAddress ; 
    char pageFilter[] = "HTTP/1.1 302 Found\n\n<html><head><title>this web page is filter !..!</title></head><body><h1>This page in filter</h1><p><h3>Please Leave This site and get out of here!</h3></p></body></html>"; 
    serverAddress.sin_family = AF_INET; 
    serverAddress.sin_port = htons(9090); 
    bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)); 
    listen(serverSocket, 20); 
    while (1) 
    { 
     int clientSocket ; 
     int size; 
     struct sockaddr_in clientAddress; 
     char * pch; 
     char * site; 
     char buffer[9000]; 
     size = sizeof(clientAddress); 
     clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddress, &size); 
     recv(clientSocket, buffer, sizeof(buffer), 0); 
     site = strstr(buffer, "yahoo.com"); 
     if(site != NULL) 
     { 
      send(clientSocket, pageFilter, sizeof(pageFilter) ,0); 
      close(clientSocket); 
     } 
     else 
     { 
      int middleSocket; 
      char buf[128]; 
      char response[10000]; 
      struct sockaddr_in middleAddress; 
      struct hostent *he; 
        struct in_addr **addr_list; 
      char site[] = "cisco.com"; 
      middleSocket = socket(AF_INET, SOCK_STREAM, 0); 
      middleAddress.sin_family = AF_INET; 
      middleAddress.sin_port = htons(80); 
      he = gethostbyname(site); 
        addr_list = (struct in_addr **)he -> h_addr_list; 
        middleAddress.sin_addr.s_addr = inet_addr(inet_ntoa(*addr_list[0])); 
      connect(middleSocket, (struct sockaddr *)&middleAddress, sizeof(middleAddress)); 
      send(middleSocket, buffer, sizeof(buffer),0); 
      while((unsigned)strlen(buf) != 0) 
      { 
       recv(middleSocket, buf, sizeof(buf), 0); 
       strcat(response,buf); 
      } 
      send(clientSocket, response, strlen(response),0); 
      close(clientSocket);  
     } 
    } 
    return 0; 
} 
+0

如何调试http://www.drpaulcarter.com/cs/debug.php –

回答

0

首先,捕获的recv的返回值,其或者表示错误,或者接收到的字节数。

ssize_t n; 

n = recv(middleSocket, buf, sizeof(buf) - 1); 

注意,你不应该通过sizeof(buf),因为你需要空间来保证buf零终止。

检查错误。

if (n == -1) { /* handle error */ } 
else if (n == 0) { /* handle empty response */ } 

并零终止buf

buf[n] = '\0'; 

您的分段错误可能是由于您在无界字符串上调用strstr而发生的。

+0

谢谢,我用什么来代替sizeof函数? –

+0

'sizeof(buf) - 1',如我的答案中所列。 – Ben

+0

仍然我的程序不工作,我在我的浏览器中得到了编码错误。你知道为什么吗? –