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