每次写C++的时候都会忘记好多以前写过的东西,所以现在把自己的问题记下来,以后方便查
环境是ubuntu 16.04
socket
目前做的是用socket实现http get请求,客户端和服务器的之后用到了再补上
#include <stdio.h>
#include <stdlib.h>
#include <string> //strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
#include <netdb.h>
#include <errno.h>
#include <iostream>
#include <cstring>
int main(int argc, char *argv[])
{
int socket_desc;
struct sockaddr_in server;
char *message;
//Create socket
socket_desc = socket(AF_INET, SOCK_STREAM , 0);
if (socket_desc == -1) {
printf("Could not create socket");
}
char ip[20] = {
0};
char *hostname = (char*)"xxx.com"; //你的域名
struct hostent *hp;
if ((hp = gethostbyname(hostname)) == NULL) {
printf("error\n");
return 1;
}
strcpy(ip, inet_ntoa(*(struct in_addr *)hp->h_addr_list[0]));
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(80); //一般都是80端口
//Connect to remote server
if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
printf("connect error");
return 1;
}
cout << "Connected" <<endl;
//Send some data
//http 协议
message = (char*)"GET / HTTP/1.1\r\nHost: xxx.com\r\nConnection:close\r\n\r\n"; //这里如果不知道写什么可以用wireshark抓包看一下
//向服务器发送数据
if (send(socket_desc, message, strlen(message) , 0) < 0) {
cout << "Send failed"<< endl;
return 1;
}
cout << "Data Send" << endl;
struct timeval timeout = {
3, 0};
setsockopt(socket_desc, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(struct timeval));
//Receive a reply from the server
//loop
int size_recv, total_size = 0;
int chunkSize = 512;
char chunk[chunkSize];
while(1) {
memset(chunk , 0 , chunkSize); //clear the variable
//获取数据
if ((size_recv = recv(socket_desc, chunk, chunkSize, 0) ) == -1) {
if (errno == EWOULDBLOCK || errno == EAGAIN) {
printf(&#