C 访问内存并更改某些变量的值
我正在尝试在一台服务器和多个客户端之间创建通信。服务器启动并等待客户端连接。我通过select设法同时打开多个套接字。当我将一些信息从客户端传递到服务器,然后再传递到另一个客户端时,会存储一个变量,例如,客户端的IP(字符*类型)与我刚刚读取的变量一起更改C 访问内存并更改某些变量的值,c,sockets,client-server,C,Sockets,Client Server,我正在尝试在一台服务器和多个客户端之间创建通信。服务器启动并等待客户端连接。我通过select设法同时打开多个套接字。当我将一些信息从客户端传递到服务器,然后再传递到另一个客户端时,会存储一个变量,例如,客户端的IP(字符*类型)与我刚刚读取的变量一起更改 struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(clientIP); address.sin_por
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(clientIP);
address.sin_port = htons(clientport);
int addrlen = sizeof(address);
if (bind(master_socket, (struct sockaddr *)&address, sizeof(address))<0){
perror("bind failed");
exit(EXIT_FAILURE);
}
printf("Listener on port %d \n", serverport);
if (listen(master_socket, 3) < 0){
perror("listen");
exit(EXIT_FAILURE);
}
while(1){
FD_ZERO(&readfds);
FD_SET(master_socket, &readfds);
max_sd = master_socket;
for( i = 0 ; i < max_clients ; i++){
sd = client_socket[i];
if(sd > 0)
FD_SET( sd , &readfds);
if(sd > max_sd)
max_sd = sd;
}
activity = select( max_sd + 1 , &readfds , NULL , NULL ,NULL);
if (FD_ISSET(master_socket, &readfds)){
if ((new_socket = accept(master_socket,(struct sockaddr *)&address, (socklen_t*)&addrlen))<0){
perror("accept");
exit(EXIT_FAILURE);
}
for (i = 0; i < max_clients; i++){
//if position is empty
if( client_socket[i] == 0 ){
client_socket[i] = new_socket;
printf("Adding to list of sockets as %d\n" , i);
break;
}
}
//inform user of socket number - used in send and receive commands
//printf("New connection , socket fd is %d , ip is : %s , port : %d\n" , new_socket , inet_ntoa(address.sin_addr) , address.sin_port);
read(new_socket, buf, 1000);
//LAST PART
struct in_addr ip;
ip.s_addr=clip;
clientip=inet_ntoa(ip);//convert the integer IP to string(like 0.0.0.0)
地址中的结构sockaddr\u;
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(clientIP);
address.sin_port=htons(客户端端口);
int addrlen=sizeof(地址);
if(绑定(主套接字,(结构sockaddr*)和地址,sizeof(地址))0)
FD_集(sd和readfds);
如果(标准差>最大标准差)
最大标准偏差=标准偏差;
}
活动=选择(最大sd+1,&readfds,NULL,NULL,NULL);
if(FD_ISSET(主插槽和读FDS)){
如果((new_socket=accept(master_socket,(struct sockaddr*)和address,(socklen_t*)和addrlen))我有怀疑:请尝试“深度复制”:
memcpy(ip.s_addr,clip,sizeof(clip));
而不是ip.s_addr=clip;
`
尝试初始化结构的其他字段:
ip.sin_family = AF_INET;
ip.sin_addr.s_addr = clip;
ip.sin_port = htons( PORT );
打印剪辑并验证它是否在主机或网络中重新加载到字节(大或小印度)Ref
这表示“inet_ntoa()函数将以网络字节顺序给出的Internet主机地址转换为IPv4点十进制表示法的字符串。字符串返回到静态分配的缓冲区中,后续调用将覆盖该缓冲区。”
因此,要保留客户端IP地址,只需将“clientip”memcopy到其他缓冲区中即可
希望这有帮助还是没什么,同时我得到一个警告:传递'memcpy'的参数2会使指针从整数变为无cast的指针,并且您是否尝试在赋值之前用memset重置结构?没有memcpy没有修复它,memset也不能与struct in_addr一起使用