- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我将 BUF_SIZE 设置为 10000 时可以正常工作,但 50000 则不行。我只是试图将数据从客户端发送到服务器并测试缓冲区大小,但我发现对于某些大小,应用程序无法正常工作。
为什么?我该如何解决??
例如,我运行服务器和客户端,第一次尝试工作正常,但当我重新运行客户端时,开始出现交付问题。
这是服务器:
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <signal.h>
#define BUF_SIZE 50000
using namespace std;
void manejador(int signo);
int main()
{
int sservice, sclient,l,nbytes_read, err, nbytes_sent;
bool end;
char buf[BUF_SIZE];
struct sockaddr_in sin, clientfsin;
pid_t pid;
int status;
sservice=socket(PF_INET,SOCK_STREAM, 0); /*Open the socket*/
if(sservice == -1)
{
perror("Server. Socket: ");
exit(-1);
}
sin.sin_family = AF_INET; /*ARPANET address family*/
sin.sin_addr.s_addr = INADDR_ANY; /*Accept connections on any Interface*/
sin.sin_port = htons(4000); /*Service TSAP > 1023. CHANGE IT!*/
/*Register the server in the system*/
err=bind(sservice, (struct sockaddr*)&sin, sizeof(sin));
if(err == -1)
{
perror("Server. bind: ");
exit(-1);
}
/*Up to 5 waiting connections*/
err = listen(sservice,5);
if(err == -1)
{
perror("Server. Listen: ");
exit(-1);
}
/* Receiving requests loop */
for(;;)
{
/*Accept a connection from a client*/
l = sizeof(clientfsin);
sclient = accept(sservice,(struct sockaddr *)&clientfsin, (socklen_t*) &l);
if(sclient == -1)
{
perror("Server. Accept: ");
continue;
}
signal(SIGCHLD,manejador); //Quitar si ponemos waitpid
pid = fork();
if(pid == -1){
printf("Error al crear el proceso hijo\n");
exit(0);
}
if(pid){
close(sclient);
//waitpid(pid,&status,0); //Descomentar si usamos waitpid
}else{
close(sservice);
/*Give the service*/
end = false;
int i=1;
while(!end && (i<=10))
{
nbytes_read=recv(sclient,(char *)buf,sizeof(buf),0);
if (nbytes_read > 0)
{
buf[nbytes_read]='\0';
//cout << "SERVER>Server received: " << buf << endl;
printf("Recepcion <%i>: Se han recibido <%i> bytes del cliente\n",i,nbytes_read);
cout.flush();
err = 0;
//sprintf(buf,"%s_server",buf);
nbytes_sent = send(sclient,(char *)buf,sizeof(buf),0);
printf("Envio <%i>: Se han enviado <%i> bytes al cliente\n",i,nbytes_sent);
i++;
}
else
{
perror("Sever. Receive/read: ");
end=true;
err = -1;
}
}
if(err >= 0)
cout << "SERVER>Cliente Atendido" << endl;
else
cout << "SERVER>Finalizacion incorrecta del cliente" << endl;
/*Never forget to close a socket!*/
close(sclient);
exit(0);
}
}
close(sservice);
printf("Fin server");
} /*main()*/
void manejador(int signo) //comentar si usamos waitpid
{
int estado;
wait(&estado);
}
这是客户端:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <sys/time.h>
#define BUF_SIZE 50000
using namespace std;
int main()
{
int sock, err;
bool end;
char buf[BUF_SIZE];
struct sockaddr_in sout;
sock=socket(PF_INET,SOCK_STREAM, 0); /*Open the socket*/
if(sock == -1)
{
perror("Client. Socket: ");
exit(-1);
}
sout.sin_family = AF_INET; /*ARPANET address family*/
sout.sin_addr.s_addr = inet_addr("127.0.0.1"); /*Which server?*/
sout.sin_port = htons(4000); /*Output port*/
/*Connect to the server*/
err = connect(sock,(struct sockaddr *)&sout, sizeof(sout));
if(err == -1)
{
perror("Client. Connect: ");
exit(-1);
}
end = false;
double t1,t2;
while(!end)
{
/*Ask for the service*/
//cout << endl << "CLIENT> Send a message...: " ; cout.flush();
//cin.getline(buf, 128);
int i=0;
for(i=0;i<10;i++){
timeval tim;
gettimeofday(&tim, NULL);
t1=tim.tv_sec+(tim.tv_usec/1000000.0);
err = send(sock,(char *)buf,sizeof(buf),0);
if(err == -1)
{
perror("Client. Send/write: ");
exit(-1);
}
printf("Envio <%i>: Se han enviado <%i> bytes\n",i+1,err);
gettimeofday(&tim, NULL);
t2=tim.tv_sec+(tim.tv_usec/1000000.0);
printf("%.6lf para el envio de <%i>\n", t2-t1,i+1);
err = recv(sock,(char *)buf,sizeof(buf),0);
printf("Recepcion <%i>: Se han recibido <%i> bytes\n",i+1,err);
//cout << "CLIENT> Server response: " << buf;
cout.flush();
}
end=true;
}
close(sock);
} /*main()*/
Offtopic:很抱歉用西类牙语发表评论 ;)
最佳答案
错误:
1) 您的服务器不会尝试确保它已收到完整的消息。
2) 无论实际需要发送多少字节,您的服务器都会发送 50,000 个字节。
3) 如果您的服务器实际读取 50,000 字节,它尝试添加终止零将溢出缓冲区。
3) 您的客户端发送了 50,000 个不确定的字节。
4) 您的客户端忽略它收到的字节数。
5) 客户端不确保它确实收到了服务器发送的终止零字节。
但你最大的错误是:你没有合理的协议(protocol)。如果消息以零字节终止,为什么要发送 50,000 字节?如果您的消息始终为 50,000 字节,为什么接收方不尝试接收 50,000 字节?
我会给你我给每个 TCP 程序员的标准建议:从开发协议(protocol)开始并记录它。协议(protocol)应指定谁发送以及何时发送。协议(protocol)应指定消息的构造方式。该协议(protocol)应指定有效和无效消息的规则。该协议(protocol)应指定如何检测和处理死连接。等等。
正确记录协议(protocol)需要一个小时左右的时间,但这是非常值得的。没有一个,很难说出我上面的哪些 bug 真的是 bug。 (例如,也许你真的应该总是发送 50,000 字节,即使消息只是“hi”。服务器是应该通过字节计数还是通过终止零来找到消息的结尾?等等。)
关于c++ - 为什么这个缓冲区大小没有被套接字正确处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10937926/
我使用下拉菜单提供一些不同的链接,但我希望这些链接在同一选项卡中打开,而不是在新选项卡中打开。这是我找到的代码,但我对 Javascript 非常缺乏知识 var urlmenu = docume
我对 javascript 不太了解。但我需要一个垂直菜单上的下拉菜单,它是纯 JavaScript,所以我从 W3 复制/粘贴脚本:https://www.w3schools.com/howto/t
我已经坐了 4 个小时,试图让我的导航显示下 zipper 接垂直,但它继续水平显示它们。我无法弄清楚为什么会发生这种情况或如何解决它。 如果有人能告诉我我做错了什么,我将不胜感激。我有一个潜移默化的
我正在尝试创建选项卡式 Accordion 样式下拉菜单。我使用 jQuery 有一段时间了,但无法使事件状态达到 100%。 我很确定这是我搞砸的 JS。 $('.service-button').
对于那些从未访问过 Dropbox 的人,这里是链接 https://www.dropbox.com/ 查看“登录”的下拉菜单链接。我如何创建这样的下 zipper 接? 最佳答案 这是 fiddle
我正在制作一个 Liferay 主题,但我在尝试设计导航菜单的样式时遇到了很多麻烦。我已经为那些没有像这样下拉的人改变了导航链接上的经典主题悬停功能: .aui #navigation .nav li
如果您将鼠标悬停在 li 上,则会出现一个下拉菜单。如果您将指针向下移至悬停时出现的 ul,我希望链接仍然带有下划线,直到您将箭头从 ul 或链接移开。这样你就知道当菜单下拉时你悬停在哪个菜单上。 知
我有一个带有多个下拉菜单的导航栏。因此,当我单击第一个链接时,它会打开下拉菜单,但是当我单击第二个链接时,第一个下拉菜单不会关闭。 (所以如果用户点击第二个链接我想关闭下拉菜单) // main.js
我正在尝试制作一个导航下拉菜单(使用 Bootstrap 3),其中链接文本在同一行上有多个不同的对齐方式。 在下面的代码中,下拉列表 A 中的链接在 HTML 中有空格字符来对齐它们,但是空白被忽略
我希望有人能帮我解决这个 Bootstrap 问题,因为我很困惑。 有人要求我在底部垂直对齐图像和其中包含图像的链接。 我面临的问题是他们还希望链接在链接/图像组合上具有 pull-right,这会杀
我正在构建一个 Rails 应用程序,并希望指向我的类的每个实例的“显示”页面的链接显示在“索引”页面的下拉列表中。我目前正在使用带有 options_from_collection_for_sele
我有以下 Bootstrap3 导航菜单 ( fiddle here )。我想设置“突出显示”项及其子链接与下拉列表 1 和 2 链接不同的链接文本(和悬停)的样式。我还希望能够以不同于 Highli
我对导航栏中的下拉菜单有疑问。对于普通的导航链接(无下拉菜单),我将菜单文本放在 H3 中,但是当我尝试对下 zipper 接执行相同操作时,箭头不在标题旁边,而是在标题下方。我决定用 span 替换
我是一名优秀的程序员,十分优秀!