仍在使用TCP_节点延迟发送一条消息

仍在使用TCP_节点延迟发送一条消息,c,sockets,tcp,C,Sockets,Tcp,从我对Nagel算法的理解来看,如果可能的话,它会尝试在一条消息中发送多条消息,以使用较少的bandwith 我的问题是,对于一个大学项目,我必须禁用它;我必须先发送一个名字,然后是一年、一个月、一天,最后是一个文件名 在服务器端,我必须将其处理为一个字符串:name/year/month/day/filename 明确规定我的客户机/服务器应与其他学生的客户机/服务器一起工作。因此,我不允许只在每条消息的结尾设置\0或其他字符,然后在服务器上处理它,因为任何学生都可能有不同的结尾字符 我的代码

从我对Nagel算法的理解来看,如果可能的话,它会尝试在一条消息中发送多条消息,以使用较少的bandwith

我的问题是,对于一个大学项目,我必须禁用它;我必须先发送一个名字,然后是一年、一个月、一天,最后是一个文件名

在服务器端,我必须将其处理为一个字符串:name/year/month/day/filename

明确规定我的客户机/服务器应与其他学生的客户机/服务器一起工作。因此,我不允许只在每条消息的结尾设置\0或其他字符,然后在服务器上处理它,因为任何学生都可能有不同的结尾字符

我的代码如下所示

int main(int argc, char *argv[])
{
  int sockfd;
  int yes=1;
  struct sockaddr_in their_addr;
  struct hostent *he;
  if ((he=gethostbyname(argv[1])) == NULL) {
    perror("Client: gethostbyname");
    return EXIT_FAILURE;
  }

  if ((sockfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))==-1) {
    perror("Client: socket");
    return EXIT_FAILURE;
  }

  their_addr.sin_family = AF_INET;
  their_addr.sin_port = htons(PORT);
  their_addr.sin_addr = *((struct in_addr*)he->h_addr);
  memset(&(their_addr.sin_zero), '\0', 8);

  if (connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr))==-1) {
    perror("Client: connect");
    return EXIT_FAILURE;
  }

  if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&yes, sizeof(int))==-1) {
    perror("Client: setsockopt");
    return EXIT_FAILURE;
  }
  if (send(sockfd,argv[2],strlen(argv[2]),0)==-1) {
    perror("Client: send username");
    return EXIT_FAILURE;
  }

  if (send(sockfd,argv[4],4,0)==-1) {
    perror("Client: send year");
    return EXIT_FAILURE;
  }
我认为这会因为线路的原因而起作用

setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&yes, sizeof(int)
有时也是这样写的,反正都不行

setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &yes, sizeof(yes));
我没有发现任何说明应该这样做的内容。我始终使用0而不是IPPROTO_TCP:

sockfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
但我发现了一些代码,所以我尝试了一下,但仍然不起作用。 在服务器端,我也有非常标准的5 recv代码,我也尝试在那里实现TCP_节点延迟,但仍然无法工作。我怀疑服务器代码是否有用,因为问题似乎来自发送一条消息的客户端

因此,我想知道我做错了什么,以及如何有效地获得5条不同的消息,而不是一条。我目前正在做的是在每次发送之间使用sleep1,这显然不是最优的


提前感谢您的回复

TCP中没有端到端的“消息”;这是一个字节流协议。该协议可以随意组合来自多个发送的字节,或者将一个发送拆分为多个段。这意味着,如果你想要离散的消息,那么你必须发明它们。通常的方法包括在实际消息字节之前发送一个长度;或者具有特定的终止字符,接收器必须扫描该字符;或者使用固定长度的消息,我建议不要这样做,因为这是不灵活的

所有这些都需要为所有学生建立一个标准方法。但现实生活就是这样:通信需要事先商定协议。我不知道你老师的意见,但如果你集体定义了一个消息标准,并将其作为提交作品的一部分写下来,我会给你很好的分数


你自己发现的消息之间的等待方法是一个非常好的解决方案;您希望您的等待时间超过了传输消息所需的时间,如果出现网络打嗝,等待时间可能会非常长。接收者希望a所有字节都能立即发送,或者b如果它轮询数据,那么“不再”表示它已经读取了整个消息。

如果有人想知道:是什么让我认为在tcp上发送一条消息是可能的。现在我仍然在使用睡眠方法,我知道这是不好的,我不应该使用。我还向负责该项目的助理发送了一封电子邮件,以了解如何处理此问题。我的猜测是,我们应该使用\0结尾的字符串,因为更改为:sendsockfd、argv[x]、strenargv[x]+1将使每个字符串以null结尾。谢谢dave回答这个问题: