为什么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
相关问答
更多-
TCP/IP模型是一个________。[2023-05-19]
a -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
您必须强制签署TestLibrary dll / project,如错误消息所述,通过向项目添加key.snk文件。 (项目属性,签名) You must strong sign the TestLibrary dll/project, as the error message says, by adding a key.snk file to the project. (Project properties, Signing)
-
VSPackage加载顺序 - 在另一个VSPackage之前加载?(VSPackage load order - load before another VSPackage?)[2023-05-18]
据推测,这是您从VSPackage B公开的VS服务 ? 如果是这种情况,当您通过调用Package.GetService从VSPackage A请求包时,Visual Studio将自动加载包。 还有一种强制加载包的API方法 ,但使用它通常意味着你做错了。 :-)你应该依赖VS来根据需要延迟加载包。 Presumably, this is a VS Service that you're exposing from VSPackage B? If that's the case, Visual Stud ... -
要在“项目类型”对话框中添加条目,需要在安装过程中安装项目模板(包含.vstemplate文件的zip文件)。 您需要从安装例程而不是VSPackage本身执行此操作。 但是,您的.vstemplate可以调用用C#编写的向导。 虽然这确实是一个“自定义向导”,但您可以提供对.NET程序集的引用。 无需使用脚本语言。 有关示例,请参阅VS2008 SDK浏览器中的IronPython> C#Example.IronPythonProject 。 不幸的是,这只展示了有限的向导功能,仅用于项目项目而不是项目, ...
-
如何将2013 vspackage升级到visual Studio 2015(How to upgrade a 2013 vspackage to visual Studio 2015)[2022-04-02]
受支持的Visual Studio版本在.vsixmanifest文件中定义。 如果在设计视图中打开它并选择“安装目标”,则扩展的版本范围当前可能为[12.0]。 要添加对VS 2015的支持,请将其更改为[12.0,14.0]。 Supported Visual Studio versions are defined in the .vsixmanifest file. If you open it in the design view and select Install Targets, the Ve ... -
所有包都实现了IVsPackage接口。 托管包项目(C#和VB.Net)抽象/隐藏实际的接口实现,由Microsoft.VisualStudio.Shell.Package类提供,它为您提供从底层IVsPackage.SetSite实现调用的Initialize()方法。 对于C ++包,IVsPackage :: SetSite实际上是通过您通过IVsPackageImpl继承的VsSiteBaseImpl模板实现的。 看看那个SetSite实现,我发现了这个小块代码: __if_exists(Deri ...
-
如何在VSPackage中找到解决方案使用的版本控制系统(How to find in VSPackage which version control system a solution uses)[2023-03-22]
好吧,经过几个小时的挖掘后,我找到了解决方案。 感谢Mark Rendle的文章和他发现的NoGit扩展的源代码,注册的源代码控制插件列表位于注册表中: HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\SourceControlProviders (在VS的情况下) 2013)。 所以现在,我们可以同时拥有插件guid和提供者的名称。 此示例代码可以获取这些值: var key = @"Software\Microsoft\Visu ... -
当ITextView打开时,我得到了正确的命令。 这是重要的原因如果ITextView没有打开它,在我看来命令失败了。 更快的方法是创建一个Editor Margin扩展项目(必须安装VS SDK)。 在EditorMargin类上执行以下操作: [Import] private SVsServiceProvider _ServiceProvider; private DTE2 _DTE2; public EditorMargin1(IWpfTextView textVi ...
-
我已经运行了。 我所做的是在同一个解决方案中创建一个WPF项目和一个vspackage。 将文件从wpf项目复制到vspackage后,添加了缺少的依赖项。 我不知道这是不是一个好方法,但它对我有用.. 格尔茨 I've got it running. What I did was to create a WPF Project and a vspackage in the same solution. Afterthat copied the file from the wpf project into ...