2013-07-31 53 views
0

我正在使用C中的套接字製作一個web代理。基本上,我聽一個給定的端口號,接收來自它的HTML請求,發出請求,然後發回我從哪裏得到的信息。C Sockets - 從一個端口收聽,現在該如何發回它?

我有第一部分工作。我能夠讀取請求並將其發送到必要的Web服務器,並且我得到有效的響應。我只是不確定如何將該響應發送到請求的端口。

(我使用netcat來發出請求並得到響應測試我的代碼,並在那一刻我想發送的響應不被Netcat的打印。)

這裏是我的相關代碼:

struct sockaddr_in port; 
bzero((char *) &port, sizeof(port)); 
port.sin_family = AF_INET; 
port.sin_port = htons(atoi(argv[1])); 
port.sin_addr.s_addr = INADDR_ANY; 
int socket; 
int acceptSocket; 
char response[RESPONSE_SIZE]; 

socket = Socket(AF_INET, SOCK_STREAM, 0); 
Bind(socket, (struct sockaddr *) &port, sizeof(port)); 
Listen(socket, 0); 
acceptSocket = Accept(socket, NULL, NULL); 

if (acceptSocket >= 0) 
    printf("Connection open on port %s\n", argv[1]); 

if (!ForwardHTTPRequest(acceptSocket, response)) 
     printf("Forward error\n"); 

shutdown(socket, 0); 
Connect(socket, (struct sockaddr *) &port, sizeof(port)); 
Send(socket, response, strlen(response), 0); 

最後三行是我嘗試發回響應。我關閉了插座的讀取側,連接以發送,然後發送。儘管這並沒有產生任何迴應。

+0

請注意:'bzero()'函數是古老的,不推薦使用,並且在當前版本的POSIX.1中甚至沒有包含。改用'memset()'。 (而且如果你的代碼中有'bcopy()',可以使用'memcpy()'或'memmove()'來替代...)另外,你的代碼示例使用名爲'Socket()','Bind() ,'Listen()','Connect()'和'Accept()'。這些拼寫錯誤,還是你真的用這些名稱實現函數? (情況有所不同,你看。) –

+0

調用你從acceptSocket接受的套接字是誤導性的。你應該叫它clientSocket或類似的東西來表明它對應你的客戶端。 – xaxxon

回答

1

acceptSocket是您正在使用的通信套接字建立的套接字。只需在關閉該套接字之前發回消息。

關閉控制套接字是很常見的,除非您確定不需要再提供任何請求。服務器的基本工作流程是:

create listensocket 
bind listensocket 
while working: 
    worksocket = accept listensocket 
    read and write to worksocket as much as you want 
    close worksocket 
shutdown/close listensocket 

(儘管它們的響應,在worksocket所做的實際工作是養殖到不同的線程或進程,從而使服務器可以處理後續請求,而無需等待)。

+0

我喜歡它,當我的問題很簡單。謝謝! – user1174511

+0

或在他的情況下,只是使其非阻塞,一切都應該沒事。我根本不涉及線程。 – xaxxon