簡體   English   中英

掛在strcmp附近的C程序

[英]C program hanging near strcmp

我正在用C構建client-server socket模擬,我接受來自客戶端的TCP connection ,然后客戶端將消息發送到我的服務器。 我成功接收到該消息,然后遍歷structs array以查找字符串匹配項

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;
      }
    }
  }
}

我的輸出是:

The received length is 9
The buf is: GET key05
The Server 2 has received a request with key GET key05
Token: key05ServerMapEntry: key05
Compare: 0

我不明白為什么下一個打印語句不打印。 我的程序永遠停止。 :(

這里有一個錯誤:

char* buf_for_token[10];
strcpy(buf_for_token, buf);

您如何設法編譯該程序? buf_for_token是一個指向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代替sizeof(serverMap) / sizeof(struct Mapping)sizeof(serverMap) / sizeof(*serverMap)

至於為什么printf("What is wrong?!?! Why is this not printing?!\\n"); 不輸出任何內容,請嘗試fflush(stdout); 確保printf()其后的是printf()之后的內容。

或者,它也可能是您沒有張貼......確切的代碼post沒有定義,函數原型缺少某些身體部位:

int main
{

最后,如果您的套接字是TCP,請注意服務器發送的客戶端發送的數據可能會以不同大小的塊(較小或較大)接收。 唯一的保證是字節流的順序。 您不應該依賴大多數情況下您收到整行的事實。 網絡擁塞或其他無法控制的情況可能會導致數據包被分片並以小塊的形式接收,或者合並成包含幾行的大塊...要處理服務器中的這種潛在情況,您應該緩沖數據並一次處理一行。

這行:
char* buf_for_token[10];
說:創建一個由10個元素組成的數組,指向char
我相信您需要:
char buf_for_token[10];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM