我正在使用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);
最後三行是我嘗試發回響應。我關閉了插座的讀取側,連接以發送,然後發送。儘管這並沒有產生任何迴應。
請注意:'bzero()'函數是古老的,不推薦使用,並且在當前版本的POSIX.1中甚至沒有包含。改用'memset()'。 (而且如果你的代碼中有'bcopy()',可以使用'memcpy()'或'memmove()'來替代...)另外,你的代碼示例使用名爲'Socket()','Bind() ,'Listen()','Connect()'和'Accept()'。這些拼寫錯誤,還是你真的用這些名稱實現函數? (情況有所不同,你看。) –
調用你從acceptSocket接受的套接字是誤導性的。你應該叫它clientSocket或類似的東西來表明它對應你的客戶端。 – xaxxon