⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test4.c

📁 培训嵌入式linux
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <errno.h>//#include <net/inet.h>#include <arpa/inet.h>#define	REMOTE_HOST	"192.168.0.1"#define	REMOTE_PORT	80int main(int argc, char **argv){  int fd;  char *remote_host;  unsigned short remote_port;  if (argc < 3)  {    fprintf(stderr, "Usage: %s <target host> <target port>\n", argv[0]);    exit(1);  }  remote_host = argv[1];  remote_port = atoi(argv[2]);  //int socket(int domain, int type, int protocol);/*  Name Purpose Man page    PF_UNIX, PF_LOCAL Local communication unix(7)    PF_INET IPv4 Internet protocols ip(7)    PF_INET6 IPv6 Internet protocols    PF_IPX IPX - Novell protocols    PF_NETLINK Kernel user interface device netlink(7)    PF_X25 ITU - T X .25 / ISO - 8208 protocol x25(7) PF_AX25 Amateur radio AX .25 protocol PF_ATMPVC Access to raw ATM PVCs PF_APPLETALK Appletalk ddp(7) PF_PACKET Low level packet interface packet(7)*/  /*     SOCK_STREAM     Provides sequenced, reliable, two - way, connection - based byte streams.An out - of - band data trans -     mission mechanism may be supported.     SOCK_DGRAM Supports datagrams(connectionless, unreliable messages of a fixed maximum length).SOCK_SEQPACKET Provides a sequenced, reliable, two - way connection - based data transmission path for datagrams     of fixed maximum length;     a consumer is required to read an entire packet with each read system call.     SOCK_RAW Provides raw network protocol access.SOCK_RDM Provides a reliable datagram layer that does not guarantee ordering.SOCK_PACKET Obsolete and should not be used in new programs;     see packet(7).   */  // XXX: step 1, socket()  //if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)  if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)  {    fprintf(stdout, "Create socket by socket() failed: %s\n", strerror(errno));    return 0;  }  fprintf(stdout, "New created socket = %d\n", fd);  // TODO: step 1.4, DNS resolve  // XXX: step 1.5 prepare remote server data struct  // int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);  struct sockaddr_in remote_addr;  memset(&remote_addr, 0, sizeof(remote_addr));  remote_addr.sin_family = PF_INET;  remote_addr.sin_port = htons(remote_port);  remote_addr.sin_addr.s_addr = inet_addr(remote_host);  // XXX: step 2, connect to remote server  if (connect(fd, (struct sockaddr *) &remote_addr, sizeof(remote_addr)) < 0)  {    fprintf(stdout, "connect to remote host: %s:%d failed: %s\n", remote_host, remote_port, strerror(errno));    return 0;  }  fprintf(stdout, "Connected to remote host: %s:%d\n", remote_host, remote_port);  // XXX: step 3, send request  //ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset);  //ssize_t write(int fildes, const void *buf, size_t nbyte);  char buf[1024];  memset(buf, 0, sizeof(buf));  strcpy(buf, "GET / HTTP/1.1\n\n");  // FIXME: check return value fo write()  if (write(fd, buf, sizeof(buf)) < 0)  {    fprintf(stdout, "Send request to %s:%d failed: %s\n", remote_host, remote_port, strerror(errno));    return 0;  }  // XXX: step 4, read response from remote server  //ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);  //ssize_t read(int fildes, void *buf, size_t nbyte);  ssize_t n;  while ((n = read(fd, buf, sizeof(buf))) > 0)  {    fprintf(stdout, "%s", buf);  }  if (n < 0)  {    fprintf(stdout, "Read from %s:%d encounter a error: %s\n", remote_host, remote_port, strerror(errno));    return 0;  }  else if (n == 0)  {    fprintf(stdout, "Remote disconnected.\n");    close(fd);  }  // XXX: step 5, disconnect from remote server  close(fd);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -