C Web服务器和Python客户端

2024-09-28 22:21:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我用c做了一个简单的web服务器。我可以通过web浏览器连接到它,它工作得很好。你知道吗

这个Web服务器的目标就是利用它。所以我编写了一个简单的python脚本,将恶意数据发送到服务器。但是,我在服务器上只收到一条错误消息:“坏文件描述符”。你知道吗

C服务器主服务器:

int main(void) {
  int sockfd, new_sockfd, yes=1; 
  struct sockaddr_in host_addr, client_addr;  
  socklen_t sin_size;

  printf("Accepting web requests on port %d\n", PORT);

  if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    error_and_exit("in socket");

  if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
    error_and_exit("setting socket option SO_REUSEADDR");

  host_addr.sin_family = AF_INET;      
  host_addr.sin_port = htons(PORT);    
  host_addr.sin_addr.s_addr = INADDR_ANY; 
  memset(&(host_addr.sin_zero), '\0', 8);

  if (bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr))     == -1)
    error_and_exit("binding to socket");

  if (listen(sockfd, 20) == -1)
    error_and_exit("listening on socket");

  while(1) {   // Accept loop
    sin_size = sizeof(struct sockaddr_in);
    new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
    if(new_sockfd == -1)
      error_and_exit("accepting connection");

    handle_connection(new_sockfd, &client_addr);
  }
 return 0;
}

python代码:

import socket
import struct
import sys
import time

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('127.0.0.1', 8000)
sock.connect(server_address)

shellcode =(....)

values = ....

try: 
    sock.sendall(values)
finally:
    sock.close()

注意事项:

1。 while(1)循环中的accept函数(来自<sys/socket.h>)返回-1,调用error_and_exit("accepting connection")。所以服务器从不为我的python客户机执行handle_connection。你知道吗

2。 error_and_exit函数的代码:

void error_and_exit(char *message) {
  char error_message[100];

  strcpy(error_message, " Error ");
  strncat(error_message, message, 83);
  perror(error_message);
  exit(-1);
}

Tags: and服务器hostmessagenewifexiterror