/** PASV command */ void ftp_pasv(Command *cmd, State *state) { if(state->logged_in){ int ip[4]; int port; char buff[255]; char *response = "227 Entering Passive Mode (%d,%d,%d,%d,%d,%d)\n"; port = gen_port(); getip(state->connection,ip); /* Close previous passive socket? */ close(state->sock_pasv); /* Start listening here, but don't accept the connection */ state->sock_pasv = create_socket(port); printf("port: %d\n",port); sprintf(buff,response,ip[0],ip[1],ip[2],ip[3],port>>8,port&0xff); state->message = buff; state->mode = SERVER; puts(state->message); }else{
int main(int argc, const char *argv[]) { int sock; sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_MPTP); if (sock < 0) { perror("Failed to create socket"); return -1; } int size = sizeof(struct sockaddr_mptp) + sizeof(struct mptp_dest); struct sockaddr_mptp *saddr = malloc(size); memset(saddr, 0, size); saddr->count = 1; saddr->dests[0].addr = ADDR; saddr->dests[0].port = gen_port(); if (bind(sock, (struct sockaddr *) saddr, size) < 0) { perror("Failed to bind socket"); close(sock); return -1; } char buf[4096]; sprintf(buf, "Buffer"); #define N 1 struct iovec iov[N]; struct msghdr msg; int size2 = sizeof(struct sockaddr_mptp) + N * sizeof(struct mptp_dest); struct sockaddr_mptp *to = malloc(size2); memset(&msg, 0, sizeof(msg)); memset(&iov, 0, sizeof(iov)); memset(to, 0, size2); int i; for (i = 0; i < N; i++) { iov[i].iov_base = buf; iov[i].iov_len = sizeof(buf); } to->count = N; for (i = 0; i < N; i++) { to->dests[i].addr = DADDR; to->dests[i].port = 100; } msg.msg_iov = iov; msg.msg_iovlen = N; msg.msg_name = to; msg.msg_namelen = size2; int ret; struct timeval tv1, tv2; gettimeofday(&tv1, NULL); for (i = 0; i < 10000 / N; i++) { ret = sendmsg(sock, &msg, sizeof(msg)); if (ret < 0) { perror("Failed to send on socket"); return -1; } } gettimeofday(&tv2, NULL); printf("diff=%ld\n", (tv2.tv_sec - tv1.tv_sec) * 1000 + (tv2.tv_usec - tv1.tv_usec) / 1000); if (close(sock) < 0) { perror("Failed to close socket"); return -1; } free(saddr); free(to); return 0; }