static void* handle_echo(void *arg) { int fd; int n; char buffer[BUFFER_SIZE]; fd = *((int *) arg); free(arg); pthread_detach(pthread_self()); while ((n=ext_read(fd, buffer, sizeof(buffer))) > 0){ if (vverbose) { printf("%-6d: Echoing %u bytes.\n", fd, n); fflush(stdout); } if (n != ext_send(fd, buffer, n, 0)) { printf("%-6d: Writing %u bytes failed.\n", fd, n); } } ext_close(fd); if (verbose) { printf("%-6d: Connection closed.\n", fd); fflush(stdout); } return(NULL); }
static void wiiext_worker(struct work_struct *work) { struct wiimote_ext *ext = container_of(work, struct wiimote_ext, worker); bool motionp; __u8 ext_type; ext_disable(ext); motionp = motionp_read(ext); ext_type = ext_read(ext); ext_enable(ext, motionp, ext_type); }
int main(int argc, char **argv) { int fd, n, addr_len, len, msg_flags, close_time, i; size_t buffer_size; fd_set rset; char buffer[1000]; struct sctp_event_subscribe evnts; struct sctp_sndrcvinfo sri; struct sockaddr_in local_addr, remote_addr; struct sctp_setprim set_prim; i = 0; if (argc < 4) { printf("Usage: client2 local_port remote_addr remote_port [autoclose]\n"); exit(-1); } if ((fd = ext_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) perror("socket"); bzero(&evnts, sizeof(evnts)); evnts.sctp_data_io_event = 1; evnts.sctp_association_event = 1; evnts.sctp_address_event = 1; evnts.sctp_send_failure_event = 1; evnts.sctp_peer_error_event = 1; evnts.sctp_shutdown_event = 1; evnts.sctp_partial_delivery_event = 1; evnts.sctp_adaption_layer_event = 1; if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts)) < 0) perror("setsockopt"); if (argc > 4) { close_time = atoi(argv[4]); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_AUTOCLOSE, &close_time, sizeof(close_time)) < 0) perror("setsockopt"); } bzero(&local_addr, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; #ifdef HAVE_SIN_LEN local_addr.sin_len = sizeof(struct sockaddr_in); #endif local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(atoi(argv[1])); if (ext_bind(fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) != 0) perror("bind"); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(atoi(argv[3])); #ifdef HAVE_SIN_LEN remote_addr.sin_len = sizeof(struct sockaddr_in); #endif remote_addr.sin_addr.s_addr = inet_addr(argv[2]); FD_ZERO(&rset); while (1) { FD_SET(fd, &rset); FD_SET(0, &rset); n = ext_select(fd + 1, &rset, NULL, NULL, NULL); if (n == 0) { printf("Timer was runnig off.\n"); } if (FD_ISSET(0, &rset)) { printf("Reading from stdin.\n"); len = ext_read(0, (void *) buffer, sizeof(buffer)); if (len == 0) break; if (num_rem > 0) { i = (i + 1) % num_rem; set_prim.ssp_assoc_id = assoc_id; memcpy(&set_prim.ssp_addr, sar + i, sizeof(struct sockaddr_in)); memcpy(&remote_addr, sar + i, sizeof(struct sockaddr_in)); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_PRIMARY_ADDR, (void *) &set_prim, sizeof(set_prim)) < 0) perror("setprim"); } if (ext_sendto(fd, (const void *)buffer, len, 0, (const struct sockaddr *)&remote_addr, sizeof(remote_addr)) != len) perror("sendto"); else printf("Message of length %d sent to %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } if (FD_ISSET(fd, &rset)) { printf("Reading from network.\n"); addr_len = sizeof(struct sockaddr_in); buffer_size = sizeof(buffer); if ((len = sctp_recvmsg(fd, (void *) buffer, buffer_size , (struct sockaddr *)&remote_addr, &addr_len, &sri,&msg_flags)) < 0) perror("recvfrom"); else { if(msg_flags & MSG_NOTIFICATION) { process_notification(fd, buffer); continue; } else { printf("Message of length %d received from %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } } } } sctp_freepaddrs(sar); if (ext_close(fd) < 0) perror("close"); sleep(2); return 0; }
int main(int argc, char **argv) { int fd, n, addr_len, len; fd_set rset; char buffer[1000]; struct sctp_event_subscribe evnts; struct sockaddr_in local_addr, remote_addr; if (argc != 4) { printf("Usage: client local_port remote_addr remote_port\n"); exit(-1); } if ((fd = ext_socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP)) < 0) perror("socket"); bzero(&evnts, sizeof(evnts)); if (ext_setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts)) < 0) perror("setsockopt"); bzero(&local_addr, sizeof(struct sockaddr_in)); local_addr.sin_family = AF_INET; #ifdef HAVE_SIN_LEN local_addr.sin_len = sizeof(struct sockaddr_in); #endif local_addr.sin_addr.s_addr = htonl(INADDR_ANY); local_addr.sin_port = htons(atoi(argv[1])); if (ext_bind(fd, (struct sockaddr *) &local_addr, sizeof(local_addr)) != 0) perror("bind"); if (ext_listen(fd, 1) != 0) perror("listen"); remote_addr.sin_family = AF_INET; remote_addr.sin_port = htons(atoi(argv[3])); #ifdef HAVE_SIN_LEN remote_addr.sin_len = sizeof(struct sockaddr_in); #endif remote_addr.sin_addr.s_addr = inet_addr(argv[2]); FD_ZERO(&rset); while (1) { FD_SET(fd, &rset); FD_SET(0, &rset); puts("\n\n\n\nSELECT...\n"); n = ext_select(fd + 1, &rset, NULL, NULL, NULL); if (n == 0) { printf("Timer was runnig off.\n"); } if (FD_ISSET(0, &rset)) { printf("Reading from stdin.\n"); len = ext_read(0, (void *) buffer, sizeof(buffer)); if (len == 0) break; if (ext_sendto(fd, (const void *)buffer, len, 0, (const struct sockaddr *)&remote_addr, sizeof(remote_addr)) != len) perror("sendto"); } if (FD_ISSET(fd, &rset)) { printf("Reading from network.\n"); addr_len = sizeof(struct sockaddr_in); if ((len = ext_recvfrom(fd, (void *) buffer, sizeof(buffer),0,(struct sockaddr *) &remote_addr, &addr_len)) < 0) {perror("recvfrom"); /* puts("STOP!------------------"); exit(1); */ } else printf("Message of length %d received from %s:%u: %.*s", len, inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), len, buffer); } } if (ext_close(fd) < 0) perror("close"); sleep(2); return 0; }