📄 test4.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 + -