[英]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.