TEST(http, async_reuse_connect) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); settings.callbacks.on_message_complete = &on_message_complete_muti_write_async; WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, hello_world_response)); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, hello_world_response)); closesocket(sock); WEB_STOP(); }
void send_file(int sockfd,char* filename){ data d; bzero(&d,sizeof(d)); d.len=0-strlen(filename); strcpy(d.buf,filename); send_n(sockfd,(char*)&d,4+(0-d.len));//send filename int fd; fd=open(filename,O_RDONLY); if(-1==fd){ perror("send_file open"); exit(-1); } int ret; while(bzero(&d,sizeof(d)),(d.len=read(fd,d.buf,sizeof(d.buf)))>0){ d.len=0-d.len; ret=send_n(sockfd,(char*)&d,4+(0-d.len)); if(-1==ret){ printf("send_n failed\n"); exit(-1); } } send_n(sockfd,(char*)&d.len,sizeof(int)); close(fd); }
TEST(http, headers_count_to_large) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, GET_REQUEST, strlen(GET_REQUEST))); for(s =0; s < 250; s ++) { send_n(sock, "h: 3\r\n", 6); } send_n(sock, "\r\n", 2); s = max_recv(sock, buf, 2048, 200 * RECV_TIMEOUT); ASSERT_EQ( s, 0); closesocket(sock); log_buf.str[log_buf.len] = 0; ASSERT_STREQ("parse error: header length too large.", log_buf.str); WEB_STOP(); }
int send_file(int sfd) { data d; bzero(&d,sizeof(d)); d.len = strlen(DOWNLOAD); strcpy(d.buf,DOWNLOAD); send_n(sfd,(char*)&d,4+d.len); int fd; fd = open(DOWNLOAD,O_RDONLY); if(-1 == fd) { perror("open"); exit(-1); } int ret; while(bzero(&d,sizeof(d)),(d.len = read(fd,d.buf,sizeof(d.buf)))>0) { ret = send_n(sfd,(char*)&d,4+d.len); if(-1 == ret) { printf("send_n filed\n"); exit(-1); } printf("ret = %d\n",ret); } int flag = 0; send_n(sfd,(char*)&flag,sizeof(int)); close(sfd); return 0; }
TEST(http, large_headers) { // large_headers will realloc memory while reading headers, and relocate buffers WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; int i; WEB_INIT(); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); for(i =0; i < 3; i ++) { ASSERT_EQ(true, send_n(sock, GET_REQUEST, strlen(GET_REQUEST))); for(s =0; s < 200; s ++) { send_n(sock, "h234567890: 345678\r\n", 20); } send_n(sock, "\r\n", 2); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, hello_world_response)); } closesocket(sock); WEB_STOP(); }
TEST(http, headers_count_too_large_at_second_request) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, GET_REQUEST "\r\n" GET_MINI_REQUEST HEAD_MINI_SIMPLE_X_200 HEAD_MINI_SIMPLE_X_50 HEAD_MINI_SIMPLE_X_10 HEAD_MINI_SIMPLE_X_10 "\r\n", strlen(GET_REQUEST "\r\n" GET_MINI_REQUEST HEAD_MINI_SIMPLE_X_200 HEAD_MINI_SIMPLE_X_50 HEAD_MINI_SIMPLE_X_10 HEAD_MINI_SIMPLE_X_10 "\r\n"))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, hello_world_response)); closesocket(sock); WEB_STOP(); log_buf.str[log_buf.len] = 0; ASSERT_STREQ("parse error: header length too large.", log_buf.str); }
TEST(http, async_check_writing) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); shttp_assert_ctx = &assert_buf; shttp_assert_cb = &on_assert; settings.callbacks.on_message_complete = &on_message_complete_async_check_is_writing; WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); //ASSERT_EQ( s, strlen(hello_world_response)); //ASSERT_EQ( 0, strcmp(buf, hello_world_response)); closesocket(sock); WEB_STOP(); assert_buf.str[assert_buf.len] = 0; ASSERT_STREQ("0 == shttp_atomic_read32(&conn_outgoing(conn).is_writing)", assert_buf.str); }
void send_file(int sfd) { int ret; data_t buf; // 要发送的结构体名字叫buf,buf包含成员长度len,buf[1000] buf.len=strlen(DOWN_FILE); // "file" 这个名字的长度就是4 ,“wangdao”就是7,这里的buf.len 就是buf.buf的长度 strcpy(buf.buf,DOWN_FILE); //copy the name of the file ret=send(sfd,&buf,buf.len+4,0); //发送文件名(4代表的是结构体的int len,为什么不包含char数组,因为可以从前面开始数,后面都是0,就不要了,所以不用传) if(-1==ret) { perror("send1"); return; } int fd=open(DOWN_FILE,O_RDONLY); if(-1==fd) { perror("open"); return; } while(bzero(&buf,sizeof(buf)),(buf.len=read(fd,buf.buf,sizeof(buf.buf)))>0) { send_n(sfd,(char*)&buf,buf.len+4); } bzero(&buf,sizeof(buf)); int flag=0; buf.len=sizeof(int); memcpy(buf.buf,&flag,4); // 把flag的地址发给buf.buf ???? send(sfd,&buf,buf.len+4,0); // 发送结束符 close(sfd); return; }
void send_file(int sfd) { int ret; data_t buf; buf.len=strlen(DOWN_FILE); strcpy(buf.buf,DOWN_FILE); ret=send(sfd,&buf, buf.len+4,0);//发送文件名 if(-1==ret) { perror("send1"); return; } int fd=open(DOWN_FILE,O_RDONLY); if(-1==fd) { perror("open"); return; } while(bzero(&buf,sizeof(buf)),(buf.len=read(fd,buf.buf,sizeof(buf.buf))) > 0) { send_n(sfd,(char*)&buf,buf.len+4); } bzero(&buf,sizeof(buf)); int flag=0; buf.len=sizeof(int); memcpy(buf.buf,&flag,4); send(sfd,&buf, buf.len+4,0);//发送结束符 close(sfd); return; }
extern "C" void user_main() { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); osKernelInitialize(); osKernelStart(); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); key_event_init(); keymat_init(); keymat_callback = key_event_handler; keymat_start(); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); while (1) { osEvent ose = osMailGet(key_events, osWaitForever); if (ose.status == osEventMail) { KeyEvent* e = (KeyEvent*)ose.value.p; // NOTE: MIDI handling is hardcoded for now buf[0] = (e->state ? 0x90 : 0x80); // use ch0 buf[1] = e->keycode; buf[2] = 100; // use hard-coded velocity osMailFree(key_events, e); send_n(3); // blocking call } } }
void send_file(int sfd) { file_t dbuf; int ret; bzero(&dbuf,sizeof(dbuf)); strcpy(dbuf.buf,FILE_NAME); dbuf.len=strlen(dbuf.buf); ret=send(sfd,(void*)&dbuf,4+dbuf.len,MSG_CONFIRM); if(-1==ret) { perror("send_file_name"); exit(-1); } int fd; fd=open(FILE_NAME,O_RDONLY); if(-1==fd) { perror("open"); exit(-1); } while(bzero(&dbuf,sizeof(dbuf)),(dbuf.len=read(fd,dbuf.buf,sizeof(dbuf.buf)))>0) { printf("the dbuf.len is %d\n",dbuf.len); ret=send_n(sfd,(char*)&dbuf,4+dbuf.len); if(-1==ret) { perror("send_file_data"); exit(-1); } } int flag=0;//发送结束标志给客户端 ret=send(sfd,(void*)&flag,sizeof(int),MSG_CONFIRM); close(sfd); }
int IOSocket::send(const char* buf,int size) { if ( m_sMessages.space() < size ) { send_n(); } return m_sMessages.put(buf,size); }
TEST(http, pipeline_request_while_two_read) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, pipeline_requests, strlen(pipeline_requests)-12)); ASSERT_EQ(true, send_n(sock, pipeline_requests + (strlen(pipeline_requests)-12), 12)); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( 0, strncmp(buf, hello_world_response, strlen(hello_world_response))); ASSERT_EQ( 0, strncmp(buf + strlen(hello_world_response), hello_world_response, strlen(hello_world_response))); closesocket(sock); WEB_STOP(); }
TEST(http, muti_write) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, hello_world_response)); closesocket(sock); WEB_STOP(); }
TEST(http, async_empty_message) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); settings.callbacks.on_message_complete = &on_message_complete_with_empty_async; WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, strlen(EMPTY_REPONSE)); ASSERT_EQ( 0, strcmp(buf, EMPTY_REPONSE)); closesocket(sock); WEB_STOP(); }
int TCPSockStream::connect(const char *host,int port,long timeout) { int ret; unsigned char buf[1]; close(); #ifdef WIN32 sock_ = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0); #else sock_ = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); #endif if(sock_ == INVALID_SOCKET) return -1; setnonblocking(1); ret = do_connect(host,port); if(ret) return -1; return send_n(buf,0,timeout); }
TEST(http, format_realloc) { WEB_DECL(); uv_os_sock_t sock; char buf[20480]; size_t s; WEB_INIT(); settings.callbacks.on_message_complete = &on_message_complete_format_realloc; WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 20480, RECV_TIMEOUT); ASSERT_EQ( s, strlen(head_abc_x_35_hello_world_response_x_52_str)); ASSERT_EQ( 0, strcmp(buf, head_abc_x_35_hello_world_response_x_52_str)); closesocket(sock); WEB_STOP(); }
TEST(http, large_headers_at_second_request) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, GET_REQUEST "\r\n" GET_REQUEST HEAD_SIMPLE_X_100 "\r\n", strlen(GET_REQUEST "\r\n" GET_REQUEST HEAD_SIMPLE_X_100 "\r\n"))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, 2*strlen(hello_world_response)); ASSERT_EQ( 0, strcmp(buf, HELLO_WORLD_RESPONSE HELLO_WORLD_RESPONSE)); closesocket(sock); WEB_STOP(); }
void *transfer(void *p) { TParam *param = (TParam *)p; int in = param->in; int out = param->out; int bro = param->bro; char buf[BUF_LEN]; while (true) { int ret = recv(in, buf, BUF_LEN, 0); if (ret <= 0) { break; } //enc(buf, ret); ret = send_n(out, buf, ret); if (ret < 0) { break; } } close(in); close(out); pthread_cancel(bro); return NULL; }
TEST(http, send_error_request) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, "1234567890" GET_REQUEST "123\r\n\r\n", strlen(GET_REQUEST) + 17)); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); ASSERT_EQ( s, 0); closesocket(sock); log_buf.str[log_buf.len] = 0; ASSERT_STREQ("parse error:HPE_INVALID_METHOD", log_buf.str); WEB_STOP(); }
TEST(http, async_end_not_call_with_not_thunked) { WEB_DECL(); uv_os_sock_t sock; char buf[2048]; size_t s; WEB_INIT(); shttp_set_log_callback(&on_log, &log_buf); settings.callbacks.on_message_complete = &on_message_complete_async_not_thunked; WEB_START(); sock = connect_tcp("127.0.0.1", TEST_PORT); ASSERT_EQ(true, send_n(sock, simple_request, strlen(simple_request))); s = max_recv(sock, buf, 2048, RECV_TIMEOUT); //ASSERT_EQ(s, strlen(BODY_NOT_COMPLETE)); //ASSERT_EQ(0, strcmp(buf, BODY_NOT_COMPLETE)); closesocket(sock); WEB_STOP(); log_buf.str[log_buf.len] = 0; ASSERT_STREQ("callback: chunked must is true while body is not completed.", log_buf.str); }
int main(int argc,char **argv) { if(argc != 3){ printf("error args\n"); return -1; } int sfd = socket(AF_INET,SOCK_STREAM,0); if(-1 == sfd){ perror("socket"); return -1; } struct sockaddr_in ser; bzero(&ser,sizeof(ser)); ser.sin_family = AF_INET; ser.sin_port = htons(atoi(argv[2])); ser.sin_addr.s_addr = inet_addr(argv[1]); int ret; ret = connect(sfd,(struct sockaddr*)&ser,sizeof(struct sockaddr)); if(-1 == ret){ perror("connect"); return -1; } printf("connect success\n"); char buf[128]; int fd; int flag = 0; while(1){ bzero(buf,sizeof(buf)); ret = read(0,buf,sizeof(buf)); if(-1 == ret){ perror("read"); return -1; } send(sfd,buf,strlen(buf),0); bzero(buf,sizeof(buf)); ret = recv(sfd,buf,sizeof(buf),0); //printf("sizeof buf is %d\n",(int)sizeof(buf)); printf("%s\n",buf); //下载文件 if(memcmp(buf,"downloading...",14) == 0){ printf("ready to receive files\n"); data_t data; bzero(&data,sizeof(data)); //接收文件名 ret = recv(sfd,&data.len,sizeof(int),0); printf("file name,len is %d\n",data.len); if(-1 == ret){ perror("recv1"); return -1; } printf("data.len is %d\n",data.len); recv(sfd,data.buf,data.len,0); printf("recv name success,name is %s",data.buf); fd = open(data.buf,O_RDWR | O_CREAT,0666); if(-1 == fd){ perror("open"); return -1; } while(1){ bzero(&data,sizeof(data)); ret= recv(sfd,&data.len,4,0); if(-1 == ret){ perror("recv2"); return -1; } //为什么这里不是recv_n recv(sfd,data.buf,data.len,0); if(-1 == ret){ perror("recv3"); return -1; } //结束文件传输 if(data.len == sizeof(int) && !memcmp(data.buf,&flag,4)){ break; } ret = write(fd,data.buf,data.len); if(ret < 0){ perror("write"); return -1; } } } if(memcmp(buf,"uploading...",12 == 0)){ char index[128]; bzero(index,sizeof(index)); recv(sfd,index,sizeof(index),0); printf("index is %s\n",index); printf("ready to upload files\n"); data_t data; bzero(&data,sizeof(data)); //接收文件名 data.len = strlen(index); strcpy(data.buf,index); /*data.len是data.buf的长度,+4是再加上int len的4个字节的长度*/ ret = send(sfd,&data,data.len + 4,0);//?发送文件名 if(-1 == ret){ perror("send1"); return -1; } fd = open(index,O_RDONLY); if(-1 == fd){ perror("open"); return -1; } //此处运用巧妙办法,直接将data.len设置为read的返回值 while(bzero(&data,sizeof(data)),(data.len = read(fd,data.buf,sizeof(data.buf))) > 0){ send_n(sfd,(char*)&data,data.len + 4); //send(sfd,&data,data.len + 4,0); } data.len = sizeof(int); memcpy(data.buf,&flag,4); ret = send(sfd,&data,data.len + 4,0);//?发送结束符 if(-1 == ret){ perror("send2"); return -1; } } } close(sfd); return 0; }