首页 \ 问答 \ 为什么tcp服务器收到一个缓冲区如果客户端发送多个缓冲区没有睡眠?(Why tcp server receives one buffer if Client sends multiple buffer without sleep?)

为什么tcp服务器收到一个缓冲区如果客户端发送多个缓冲区没有睡眠?(Why tcp server receives one buffer if Client sends multiple buffer without sleep?)

如果我在某个时间间隔后发送缓冲区,我的客户端会正确发送到服务器。 但是,如果我发送消息没有间隔服务器接收一个缓冲区。例如,如果我发送两个缓冲区“message1”和“message2”,并在这两个发送操作服务器之间放置1秒睡眠接收2缓冲区并打印message1“\ n”message2。 但是,如果我发送这2个缓冲区没有睡眠服务器获取1缓冲区并打印message1message2。 我无法理解为什么会发生这种情况。我的服务器和客户端代码如下。

server.c

            #include<stdio.h>
            #include<string.h>    //strlen
            #include<stdlib.h>    //strlen
            #include<sys/socket.h>
            #include<arpa/inet.h> //inet_addr
            #include<unistd.h>    //write

            #include<pthread.h> //for threading , link with lpthread

            void *connection_handler(void *);

            int main(int argc, char *argv[])
            {
                int socket_desc, new_socket, c, *new_sock;
                struct sockaddr_in server, client;
                char *message;

                //Create socket
                socket_desc = socket(AF_INET, SOCK_STREAM, 0);
                if (socket_desc == -1)
                {
                    printf("Could not create socket");
                }

                //Prepare the sockaddr_in structure
                server.sin_family = AF_INET;
                server.sin_addr.s_addr = INADDR_ANY;
                server.sin_port = htons(10240);

                //Bind
                if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
                {
                    puts("bind failed");
                    return 1;
                }
                puts("bind done");

                //Listen
                listen(socket_desc, 3);

                //Accept and incoming connection
                puts("Waiting for incoming connections...");
                c = sizeof(struct sockaddr_in);
                while ((new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)))
                {
                    puts("Connection accepted");

                    //Reply to the client
            //      message = "Hello Client , I have received your connection. And now I will assign a handler for you\n";
            //      write(new_socket, message, strlen(message));

                    pthread_t sniffer_thread;
                    new_sock = malloc(1);
                    *new_sock = new_socket;

                    if (pthread_create(&sniffer_thread, NULL, connection_handler, (void*)new_sock) < 0)
                    {
                        perror("could not create thread");
                        return 1;
                    }

                    //Now join the thread , so that we dont terminate before the thread
                    //pthread_join( sniffer_thread , NULL);
                    puts("Handler assigned");
                }

                if (new_socket<0)
                {
                    perror("accept failed");
                    return 1;
                }
                while (1);
                return 0;
            }



            void *connection_handler(void *socket_desc)
            {
                //Get the socket descriptor
                int sock = *(int*)socket_desc;
                int read_size;
                char *message, client_message[2000];

                //Send some messages to the client
            //  message = "Greetings! I am your connection handler\n";
            //  write(sock, message, strlen(message));
            // 
            //  message = "Now type something and i shall repeat what you type \n";
            //  write(sock, message, strlen(message));

                //Receive a message from client
                while ((read_size = recv(sock, client_message, 2000, 0)) > 0)
                {
                    puts(client_message);
                    //Send the message back to client
                    //write(sock, client_message, strlen(client_message));
                    memset(client_message, 0, sizeof(client_message));
                }

                if (read_size == 0)
                {
                    puts("Client disconnected");
                    fflush(stdout);
                }
                else if (read_size == -1)
                {
                    perror("recv failed");
                }

                //Free the socket pointer
                free(socket_desc);

                return 0;
            }

client.c

            #include<stdio.h>
            #include<string.h>    //strlen
            #include<sys/socket.h>
            #include<arpa/inet.h> //inet_addr

            int main(int argc, char *argv[])
            {
                int socket_desc;
                struct sockaddr_in server;
                char *message, server_reply[2000];

                //Create socket
                socket_desc = socket(AF_INET, SOCK_STREAM, 0);
                if (socket_desc == -1)
                {
                    printf("Could not create socket");
                }

                server.sin_addr.s_addr = inet_addr("192.168.246.26");
                server.sin_family = AF_INET;
                server.sin_port = htons(10240);

                //Connect to remote server
                if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
                {
                    puts("connect error");
                    return 1;
                }

                puts("Connected\n");

                //Send some data
                message = "nayan";
                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "Mazhar vai";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "Sarwar vai";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "joy";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "sumon";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "rahim";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "karim";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }

                /*sleep(1);*/
                message = NULL;
                message = "jamal";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "kamal";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/ 
                message = NULL;
                message = "salam";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                //Receive a reply from the server
            //  if (recv(socket_desc, server_reply, 2000, 0) < 0)
            //  {
            //      puts("recv failed");
            //  }
            //  puts("Reply received\n");
            //  puts(server_reply);

                return 0;
            }

My Client is sending to the server correctly if I send buffers after some interval. But if I send messages without interval server receives one buffer.For example if i send two buffers "message1" and "message2" and puts 1 second sleep between this two sending operation server receives 2 buffers and prints message1 "\n" message2. But if I send these 2 buffers without sleep server gets 1 buffer and prints message1message2. I can't understand why it is happening.My server and client code are as follows.

server.c

            #include<stdio.h>
            #include<string.h>    //strlen
            #include<stdlib.h>    //strlen
            #include<sys/socket.h>
            #include<arpa/inet.h> //inet_addr
            #include<unistd.h>    //write

            #include<pthread.h> //for threading , link with lpthread

            void *connection_handler(void *);

            int main(int argc, char *argv[])
            {
                int socket_desc, new_socket, c, *new_sock;
                struct sockaddr_in server, client;
                char *message;

                //Create socket
                socket_desc = socket(AF_INET, SOCK_STREAM, 0);
                if (socket_desc == -1)
                {
                    printf("Could not create socket");
                }

                //Prepare the sockaddr_in structure
                server.sin_family = AF_INET;
                server.sin_addr.s_addr = INADDR_ANY;
                server.sin_port = htons(10240);

                //Bind
                if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
                {
                    puts("bind failed");
                    return 1;
                }
                puts("bind done");

                //Listen
                listen(socket_desc, 3);

                //Accept and incoming connection
                puts("Waiting for incoming connections...");
                c = sizeof(struct sockaddr_in);
                while ((new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)))
                {
                    puts("Connection accepted");

                    //Reply to the client
            //      message = "Hello Client , I have received your connection. And now I will assign a handler for you\n";
            //      write(new_socket, message, strlen(message));

                    pthread_t sniffer_thread;
                    new_sock = malloc(1);
                    *new_sock = new_socket;

                    if (pthread_create(&sniffer_thread, NULL, connection_handler, (void*)new_sock) < 0)
                    {
                        perror("could not create thread");
                        return 1;
                    }

                    //Now join the thread , so that we dont terminate before the thread
                    //pthread_join( sniffer_thread , NULL);
                    puts("Handler assigned");
                }

                if (new_socket<0)
                {
                    perror("accept failed");
                    return 1;
                }
                while (1);
                return 0;
            }



            void *connection_handler(void *socket_desc)
            {
                //Get the socket descriptor
                int sock = *(int*)socket_desc;
                int read_size;
                char *message, client_message[2000];

                //Send some messages to the client
            //  message = "Greetings! I am your connection handler\n";
            //  write(sock, message, strlen(message));
            // 
            //  message = "Now type something and i shall repeat what you type \n";
            //  write(sock, message, strlen(message));

                //Receive a message from client
                while ((read_size = recv(sock, client_message, 2000, 0)) > 0)
                {
                    puts(client_message);
                    //Send the message back to client
                    //write(sock, client_message, strlen(client_message));
                    memset(client_message, 0, sizeof(client_message));
                }

                if (read_size == 0)
                {
                    puts("Client disconnected");
                    fflush(stdout);
                }
                else if (read_size == -1)
                {
                    perror("recv failed");
                }

                //Free the socket pointer
                free(socket_desc);

                return 0;
            }

client.c

            #include<stdio.h>
            #include<string.h>    //strlen
            #include<sys/socket.h>
            #include<arpa/inet.h> //inet_addr

            int main(int argc, char *argv[])
            {
                int socket_desc;
                struct sockaddr_in server;
                char *message, server_reply[2000];

                //Create socket
                socket_desc = socket(AF_INET, SOCK_STREAM, 0);
                if (socket_desc == -1)
                {
                    printf("Could not create socket");
                }

                server.sin_addr.s_addr = inet_addr("192.168.246.26");
                server.sin_family = AF_INET;
                server.sin_port = htons(10240);

                //Connect to remote server
                if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0)
                {
                    puts("connect error");
                    return 1;
                }

                puts("Connected\n");

                //Send some data
                message = "nayan";
                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "Mazhar vai";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "Sarwar vai";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "joy";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "sumon";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "rahim";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "karim";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }

                /*sleep(1);*/
                message = NULL;
                message = "jamal";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/
                message = NULL;
                message = "kamal";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                /*sleep(1);*/ 
                message = NULL;
                message = "salam";

                if (send(socket_desc, message, strlen(message), 0) < 0)
                {
                    puts("Send failed");
                    return 1;
                }
                //Receive a reply from the server
            //  if (recv(socket_desc, server_reply, 2000, 0) < 0)
            //  {
            //      puts("recv failed");
            //  }
            //  puts("Reply received\n");
            //  puts(server_reply);

                return 0;
            }

原文:https://stackoverflow.com/questions/41676614
更新时间:2023-09-26 19:09

相关问答

更多

相关文章

更多

最新问答

更多
  • python的访问器方法有哪些
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。
  • 响应navi重叠h1和nav上的h1链接不起作用(Responsive navi overlaps h1 and navi links on h1 isn't working)
  • 在C中读取文件:“r”和“a +”标志的不同行为(Reading a File in C: different behavior for “r” and “a+” flags)
  • NFC提供什么样的带宽?(What Kind of Bandwidth does NFC Provide?)
  • 元素上的盒子阴影行为(box-shadow behaviour on elements)
  • Laravel检查是否存在记录(Laravel Checking If a Record Exists)
  • 设置base64图像的大小javascript - angularjs(set size of a base64 image javascript - angularjs)
  • 想学Linux 运维 深圳有哪个培训机构好一点
  • 为什么有时不需要在lambda中捕获一个常量变量?(Why is a const variable sometimes not required to be captured in a lambda?)
  • 在Framework 3.5中使用服务器标签<%=%>设置Visible属性(Set Visible property with server tag <%= %> in Framework 3.5)
  • AdoNetAppender中的log4net连接类型无效(log4net connection type invalid in AdoNetAppender)
  • 错误:发送后无法设置标题。(Error: Can't set headers after they are sent. authentication system)
  • 等待EC2实例重启(Wait for an EC2 instance to reboot)
  • 如何在红宝石中使用正则表达式?(How to do this in regex in ruby?)
  • 使用鼠标在OpenGL GLUT中绘制多边形(Draw a polygon in OpenGL GLUT with mouse)
  • 江民杀毒软件的KSysnon.sys模块是什么东西?
  • 处理器在传递到add_xpath()或add_value()时调用了什么顺序?(What order are processors called when passed into add_xpath() or add_value()?)
  • sp_updatestats是否导致SQL Server 2005中无法访问表?(Does sp_updatestats cause tables to be inaccessible in SQL Server 2005?)
  • 如何创建一个可以与持续运行的服务交互的CLI,类似于MySQL的shell?(How to create a CLI that can interact with a continuously running service, similar to MySQL's shell?)
  • AESGCM解密失败的MAC(AESGCM decryption failing with MAC)
  • SQL查询,其中字段不包含$ x(SQL Query Where Field DOES NOT Contain $x)
  • PerSession与PerCall(PerSession vs. PerCall)
  • C#:有两个构造函数的对象:如何限制哪些属性设置在一起?(C#: Object having two constructors: how to limit which properties are set together?)
  • 平衡一个精灵(Balancing a sprite)
  • n2cms Asp.net在“文件”菜单上给出错误(文件管理器)(n2cms Asp.net give error on Files menu (File Manager))
  • Zurb Foundation 4 - 嵌套网格对齐问题(Zurb Foundation 4 - Nested grid alignment issues)
  • 湖北京山哪里有修平板计算机的