我正在尝试一个基本的客户端服务器程序。 我需要我的服务器来获取客户端的IP地址。 我的服务器代码中的以下行执行此操作
SNIPPET 1
struct sockaddr_in* laddr=malloc(sizeof(struct sockaddr_in));
socklen_t len;
int accepted_fd = accept(sockfd,(struct sockaddr*)laddr,&len);
char* ip = malloc(20);
inet_ntop(AF_INET,&(laddr->sin_addr), ip,20);
这完美无缺,我得到了正确的客户端IP地址。
但是,如果我在下面添加以下两行来从客户端
中读取数据SNIPPET 2
struct message* m=(struct message*)malloc(sizeof(struct message));
int num_bytes = read(accepted_fd,m,sizeof(struct message));
然后ip被读为零。 我的意思是在 SNIPPET 1 下添加 SNIPPET 2 以某种方式改变 SNIPPET 1 的工作。
有人可以解释一下发生了什么吗? 感谢。
编辑1
这是服务器的整个主要功能
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("Error port number missing\n");
exit(-1);
}
char* relay_server_port = argv[1];
int sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(relay_server_port));
addr.sin_addr.s_addr = INADDR_ANY;
int success = bind(sockfd,(const struct sockaddr*)&addr,sizeof(addr));
success = listen(sockfd,4);
while(1)
{
struct sockaddr_in* laddr=malloc(sizeof(struct sockaddr_in));
socklen_t len;
int accepted_fd = accept(sockfd,(struct sockaddr*)laddr,&len);
char* ip = malloc(20);
inet_ntop(AF_INET,&(laddr->sin_addr), ip,20);
printf("%s\n",ip);
struct message* m=(struct message*)malloc(sizeof(struct message));
int num_bytes = read(accepted_fd,m,sizeof(struct message));
close(accepted_fd);
}
return 0;
}
答案 0 :(得分:1)
我明白了。我必须将len
的值初始化为sockaddr_in
结构的大小,即它是值结果参数。