我正在编写套接字程序并尝试解析用户的命令行参数。假设我有一个看起来像这样的函数:
void *parseUserReq(char *arg)
{
int sock;
char buffer[1024];
int readIn;
char *str1, *str2, *str3;
//cast sock back to int
sock = (int)arg;
//Get input from client
readIn = recv(sock, buffer, 1024, 0);
buffer[readIn] = '\0';
//parse the 3 strings the user is supposed to enter
str1 = (char*)malloc(sizeof(buffer)+1);
strcpy(str1, buffer); // copy header data into str1
str1 = strtok(str1, " ");
printf("%s\n", str1);
str2 = strtok(str2, " ");
printf("%s\n", str2);
str3 = strtok(str3, "\r\n");
printf("%s\n", str3);
} // End of parseUserReq
我如何在main中调用该函数?目前我正在做这样的事情:
int main(int argc, char** argv)
{
// ^^^Calls for create, bind, listen, accept, and send^^^
char buffer[1024];
parseUserReq(buffer); // segmentation fault
return 0;
}
我可以添加我的代码来创建和绑定套接字,并在必要时监听,接受,发送。
编辑:刚刚花了一些时间,发现问题比我最初描述的更复杂。我将使用Valgrind来确定问题的根源,或者只是根据你的评论完全重写这个功能。在下次发布之前,我会更广泛地寻找答案。再次感谢大家的帮助!
答案 0 :(得分:1)
str1 = (char*)malloc(sizeof(buffer)+1);
strcpy(str1, buffer); // copy header data into str1
recv没有空终止缓冲区。 recv返回接收的字节数。因此:
str1 = (char*)malloc(readIn);
memcpy(str1, buffer, readIn); // copy header data into str1
str1[readIn] = 0;
顺便说一句,recv可能由于
而失败sock = (int)arg;
您需要将缓冲区和套接字作为两个不同的参数传递。
你即将发现这个模型存在许多问题但是必须要运行一些东西才能学会它。
答案 1 :(得分:0)
你声明你的函数返回一个void POINTER,而不仅仅是你可能意味着的void。
重新定义你的函数,或者,如果你真的想要一个指针,请在调用它的地方声明一个void指针,并将返回值赋给该指针。
在答案中我假设在功能中一切都很好。