C程序挂在strcmp附近

C程序挂在strcmp附近,c,sockets,strcmp,C,Sockets,Strcmp,我正在用C语言构建一个客户机-服务器套接字模拟。我接受来自客户机的TCP连接,然后客户机向我的服务器发送一条消息。我成功地接收到消息,然后遍历我的结构数组以查找字符串匹配 struct Mapping { char key[6]; char value[8]; } MapElement; int main { char buf[BUFSIZE]; /* BUFSIZE 2048 */ int size = 4; struct Mapping serverMap[size

我正在用C语言构建一个客户机-服务器套接字模拟。我接受来自客户机的TCP连接,然后客户机向我的服务器发送一条消息。我成功地接收到消息,然后遍历我的结构数组以查找字符串匹配

struct Mapping
{
  char  key[6];
  char  value[8];
} MapElement;

int main
{
  char buf[BUFSIZE]; /* BUFSIZE 2048 */
  int size = 4;
  struct Mapping serverMap[size];
  initialize_server_map(serverMap); /* This method works, so not displaying in SO */

  /* ... socket stuff (this works as seen from print statements) */

  recvlen = recv(rqst, buf, BUFSIZE, 0);
  printf("The received length is %d\n", recvlen);
  printf("The buf is: %s\n", buf);
  if (recvlen > 0) {
    buf[recvlen] = 0;
    printf("The Server 2 has received a request with key %s\n", buf);
    char* buf_for_token[10];
    strcpy(buf_for_token, buf);
    const char s[2] = " ";
    char *token;
    token = strtok(buf_for_token, s);
    token = strtok(NULL, s);
    int found = 0;
    for(int i = 0; i < sizeof(serverMap) / sizeof(struct Mapping); i++) {
      printf("Token: %sServerMapEntry: %s\n", token, serverMap[i].key);
      printf("Compare: %d\n", strcmp(serverMap[i].key, token));
      if (strcmp(serverMap[i].key, token) == 0) {
        printf("What is wrong?!?! Why is this not printing?!\n");
        found = 1;
        strcpy(post, "POST ");
        strcat(post, serverMap[i].value);
        if (send(rqst, post, strlen(post), 0) < 0) {
          perror("sendto");
        }
        break;
      }
    }
  }
}
我不明白为什么下一个打印语句没有打印。我的程序永远挂着

这里有一个bug:

char* buf_for_token[10];
strcpy(buf_for_token, buf);
你是如何编译这个程序的? buf_for_标记是指向char的指针数组,它应该是char数组,并使其足够大:

char buf_for_token[BUFSIZE];
strcpy(buf_for_token, buf);
此缓冲区应与接收缓冲区一样大,并且如注释中所述,您应将小于其大小的1传递给recv,以便为您在末尾强制执行的“\0”保留一个额外字节:

recvlen = recv(rqst, buf, sizeof(buf) - 1, 0);
在for循环中,使用size而不是sizeofserverMap/sizeofstruct映射或sizeofserverMap/sizeof*serverMap

至于为什么打印错误是什么?!?!为什么这不打印\N不输出任何内容,请尝试fflushstdout;在printf之后,确保它不仅仅是一个缓冲问题

或者也可能是你没有发布准确的代码。。。post未定义,功能原型缺少一些身体部位:

int main
{
最后,如果您的套接字是TCP,请注意,客户端发送的数据可能会被服务器以不同大小的块接收,大小不一。唯一的保证是字节流的顺序。你不应该依赖于这样一个事实,即大多数时候你都会收到一整行。网络拥塞或超出yoyr控制范围的其他情况可能会导致数据包被切成小块并接收,或组合成包含多行的大块。。。要处理服务器中的这种潜在情况,您应该缓冲数据并一次处理一行。

这一行: char*buf_表示_令牌[10]; 说明:创建一个包含10个元素的数组,指向char 我相信你需要:
char buf_表示_令牌[10]

请在recv调用中尝试BUFSIZE-1。打印buf是:%s\n,buf。。。buf[recvlen]=0;。我认为您有必要使用\0终止buf,但是您只有在错误地尝试将其打印为字符串后才这样做。printf将打印buf,直到它找到一个\0,如果它不在那里,您将崩溃。我正在使用XCode gcc编译。它给了我警告,但它仍然编译。我现在试试你的建议。警告是编译器认为你的代码不正确的重要标志。您可以信任编译器:不要忽略它们,阅读它们并修复它们。如果您不理解它们,您就不理解代码的真正含义。将这些选项添加到Makefile中的CFLAGS:-Wall-W-werror使用sizeofbuf_作为_标记-1而不是BUFSIZE-1,以避免在更改大小声明时出现错误,并忘记更改strcpy中的大小引用(有时称为code rot)。@chqrlie感谢所有C-ism提示。根据您的建议,除了一个警告之外,我已经消除了所有警告。@Brian Vanover:bug消失了吗?哪个警告是抵制的?
int main
{