socket方式发送Http GET消息
来源:互联网 发布:新闻类app项目源码 编辑:程序博客网 时间:2024/05/24 04:25
#include <stdio.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") // 连接服务器发送消息并将接收数据保存到 pReceiveBuf 中,此过程会 select 并 recv 消息,直到没有数据到达或者接收缓存已满 int connectAndSendData(const char *szHost, unsigned short nPort, const char *pDataToSend, unsigned int nDataSize, char *pReceiveBuf = NULL, unsigned int *pnReceiveSize = NULL) { WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData; int err = ::WSAStartup(wVersionRequested, &wsaData); if ( 0 != err ) { printf("[connectAndSendData]: WSAStartup failed. return %d. \r\n", err); return -1; } if ( wsaData.wVersion != wVersionRequested ) { printf("[connectAndSendData]: wsaData.wVersion %d is not equal to wVersionRequested %d.\r\n", wsaData.wVersion, wVersionRequested); ::WSACleanup(); return -2; } SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if ( INVALID_SOCKET == sock ) { printf("[connectAndSendData]: socket error %d. \r\n", WSAGetLastError()); return -3; } struct hostent *p_hostent = gethostbyname(szHost); if( NULL == p_hostent ) { printf("[gethostbyname]: socket error %d. \r\n", WSAGetLastError()); ::closesocket(sock); ::WSACleanup(); return -4; } SOCKADDR_IN addr_server; addr_server.sin_family = AF_INET; addr_server.sin_addr = *((struct in_addr*)p_hostent->h_addr); memset(addr_server.sin_zero, 0, 8); addr_server.sin_port = htons(nPort); err = ::connect(sock, (SOCKADDR*)&addr_server, sizeof(addr_server)); if ( SOCKET_ERROR == err ) { printf("[connectAndSendData]: connect %s:%d error %d. \r\n", szHost, nPort, WSAGetLastError()); ::closesocket(sock); ::WSACleanup(); return -5; } err = ::send(sock, pDataToSend, nDataSize, 0); if ( SOCKET_ERROR == err ) { printf("[connectAndSendData]: send error %d. \r\n", WSAGetLastError()); } if ( NULL != pReceiveBuf && NULL != pnReceiveSize ) { char *p_receive = pReceiveBuf; char *p_buf = p_receive; int n_buf_len = *pnReceiveSize; int n_len = n_buf_len - 1; int n_read = 0; char temp[256]; int n_head_len = -1; int n_content_len = -1; const char *content = NULL; while (1) { fd_set fds; FD_ZERO(&fds); FD_SET(sock, &fds); struct timeval timeo; timeo.tv_sec = 10; timeo.tv_usec = 1000; int ret = select(sock, &fds, NULL, NULL, &timeo); if (ret <= 0) break; if (FD_ISSET(sock, &fds)) { n_read = ::recv(sock, p_buf, n_len, 0); if (n_read <= 0) break; p_buf += n_read; n_len -= n_read; if ( n_len == 0 ) break; const char *rnrn = strstr(p_receive, "\r\n\r\n"); if (NULL != rnrn && rnrn < p_buf) { rnrn += 4; content = rnrn; if (-1 == n_content_len) { const char *content_length = strstr(p_receive, "Content-Length: "); if (NULL != content_length && content_length < p_buf) { content_length += 16; const char *rn = strstr(content_length, "\r\n"); if (NULL != rn && rn < p_buf) { int count = rn - content_length; strncpy(temp, content_length, count); temp[count] = '\0'; n_content_len = atoi(temp); } } if (-1 == n_content_len) { const char *rn = strstr(rnrn, "\r\n"); if (NULL != rn && rn < p_buf) { int count = rn - rnrn; strncpy(temp, rnrn, count); temp[count] = '\0'; if (1 == sscanf(temp, "%x", &n_content_len) ) { n_content_len += 7; // 0D 0A 30 0D 0A 0D 0A content = rn + 2; } } } if (-1 == n_content_len) { const char *connection = strstr(p_receive, "Connection: "); if (NULL != connection && connection < p_buf) { connection += 12; const char *rn = strstr(connection, "\r\n"); if (NULL != rn && rn < p_buf) { int count = rn - connection; strncpy(temp, connection, count); temp[count] = '\0'; connection = _strupr(temp); if (0 == strcmp(connection, "CLOSE")) n_content_len = 0; } } } } } if (NULL != content && n_content_len > 0) { n_head_len = content - p_receive; int n_cur_len = p_buf - p_receive; if ( n_cur_len >= n_head_len + n_content_len ) break; } } } n_len = n_buf_len - 1 - n_len; n_buf_len = n_len; p_receive[n_len] = '\0'; } err = ::closesocket(sock); if ( SOCKET_ERROR == err ) { printf("[connectAndSendData]: closesocket error %d. \r\n", WSAGetLastError()); } ::WSACleanup(); return 0; } int main() { char request_buffer[1024]; request_buffer[0] = '\0'; // 写 HTTP 头信息 // HTPP 头可以有多行,每行都以 \r\n 结尾,最后再以 \r\n 结束 strcat(request_buffer, "GET /index.php?id=1 HTTP/1.1\r\n"); strcat(request_buffer, "Host: 127.0.0.1:80\r\n"); strcat(request_buffer, "Connection: keep-alive\r\n"); strcat(request_buffer, "Accept: */*\r\n"); strcat(request_buffer, "\r\n"); char receive_buff[102400]; unsigned n_receive_len = 102400; receive_buff[0] = '\0'; connectAndSendData("127.0.0.1", 80, request_buffer, strlen(request_buffer), receive_buff, &n_receive_len); printf(receive_buff); getchar(); return 0; }
0 0
- socket方式发送Http GET消息
- Http GET和Http Post发送方式
- 使用socket发送http请求(GET/POST)
- 使用socket发送http请求(GET/POST)
- 使用socket发送http请求(GET/POST)
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- 【网络】JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
- http 发送数据方式 post get soap
- http post方式发送xml格式消息
- 用JAVA Socket向http服务器发送GET命令
- 用java socket向http服务器发送get命令
- 练习使用 socket 发送简单的 HTTP GET 请求
- socket模仿浏览器发送http get请求,响应体乱码
- socket编程---实现get post 向http发送请求
- PHP Socket实现HTTP GET POST请求发送
- 重写ArcGIS的TiledMapServiceLayer调用天地图瓦片
- Android 输入法导致EditText编辑框问题
- Win7下硬盘安装Ubuntu 12.04.4 LTS双系统
- FFT和IFFT的C代码实现
- linux下检测U盘插入并读取文件
- socket方式发送Http GET消息
- Android_UiAutomator自动化测试框架
- 用栈实现拓扑排序
- 编写自定义cordova插件(JS)
- 函数调用过程(反汇编分析)
- 【C++】智能指针auto_ptr的简单实现
- 注重效率的哲学
- 第十三周项目一--动物这样叫(2)
- Linux中find常见用法示例