Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <queue>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <string.h>
- #include <unistd.h>
- #include <time.h>
- #include <string.h>
- #include <unordered_map>
- #include <sys/un.h>
- #include <arpa/inet.h>
- #ifndef SOCK_NONBLOCK
- #include <fcntl.h>
- # define SOCK_NONBLOCK O_NONBLOCK
- #endif
- using namespace std;
- struct client;
- bool flag;
- int socket_for_server; //socket_id -> socket_for_server
- sockaddr_in address;// sockaddr_in self_addr -> address
- timespec tm;
- void *data_reception(void *args){ //функция приема данных из сокета
- while (flag) {
- char buffer[64];
- memset(buffer, 0, 64);
- int byte_received = 0;
- while ((byte_received = recv(socket_for_server, buffer, 64, 0)) <= 0) {
- if (byte_received == 0) {
- flag = false;
- pthread_exit(NULL);
- }
- if (!flag) {
- pthread_exit(NULL);
- }
- nanosleep(&tm, NULL);
- }
- printf("%s", buffer);
- fflush(stdout);
- }
- }
- void *data_transfer (void *args) { // функция передачи данных в сокет; func_send -> data_transfer
- fd_set readfs;
- int fd_stdin = fileno(stdin);
- timeval tv;
- while (flag) {
- char buffer[64];
- memset(buffer, 0, 64);
- while (true) {
- tv.tv_sec = 0;
- tv.tv_usec = 100000;
- FD_ZERO(&readfs);
- FD_SET(fd_stdin, &readfs);
- int res = select(fd_stdin + 1, &readfs, NULL, NULL, &tv);
- if (res > 0)
- {
- scanf("%s", buffer);
- break;
- }
- if (!flag)
- pthread_exit(NULL);
- }
- if (strcmp(buffer, "exit") == 0)
- {
- flag = false;
- pthread_exit(NULL);
- }
- send(socket_for_server, buffer, strlen(buffer), 0);
- sleep(1);
- }
- }
- int main()
- {
- flag = true;
- tm.tv_sec = 0;
- tm.tv_nsec = 10000000;
- address.sin_family = AF_INET;
- address.sin_port = htons(31337);
- inet_pton(AF_INET, "127.0.0.1", &(address.sin_addr));
- socket_for_server = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
- perror("socket()");
- printf("Wait connection\n");
- fd_set readfs; //дескриптор файла
- int fd_stdin = fileno(stdin);
- timeval tv;
- while (connect(socket_for_server, (struct sockaddr *)&address, sizeof(struct sockaddr)) == -1) {
- FD_ZERO(&readfs);
- FD_SET(fd_stdin, &readfs);
- tv.tv_sec = 0;
- tv.tv_usec = 100000;
- int res = select(fd_stdin + 1, &readfs, NULL, NULL, &tv);
- if (res > 0) {
- char c;
- scanf("%c", &c);
- shutdown(socket_for_server, SHUT_WR);
- close(socket_for_server);
- return 0;
- }
- }
- printf("Connection successfull!\n");
- pthread_t thread_transfer, thread_reception;
- pthread_create(&thread_transfer, NULL, &data_transfer, NULL);
- pthread_create(&thread_reception, NULL, &data_reception, NULL);
- pthread_join(thread_transfer, NULL);
- pthread_join(thread_reception, NULL);
- shutdown(socket_for_server, SHUT_WR);
- close(socket_for_server);
- printf("Client close\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment