char filePath[100]="/home/wind/software/eclipse/eclipse2/server_multiaccess/wrPro3"
、通信に使用する子ソケットのソケット番号が急に変わってしまいます。なぜだろうか。結果は写真のようになります:gdbでwatchを使用した結果
sockM
は私が自分で定義した構造体リストの先頭です。子構造体を構造体リストに入れようとしています。
struct Sock{
int socket;
short int ifMain;
short int status;
FILE* fp; // Cannot be initialized here
long int filePoint;
char recvBuf[BUFSZ];
char sendBuf[BUFSZ];
char command[BUFSZ];
unsigned long int answer;
};
struct sockListEle{
struct Sock sock;
struct sockListEle* last;
struct sockListEle* next;
struct sockListEle* head;
struct sockListEle* end;
int sockNum;
};
int main(void) {
int mainS,childS;
struct sockaddr_in mainSock;
int on;
.....
.....
while(1){
FD_SET(mainS,&mainRead);
select(mainS+1,&mainRead,NULL,NULL,&timeout);
if(FD_ISSET(mainS,&mainRead)){
struct sockaddr_in childSock;
.....
struct sockListEle sockC;
sockC.sock.ifMain=0;
......
sockC.next = NULL;
sockM.end = &sockC;
sockM.sockNum++;
sockC.last->next = &sockC;
maxfdp = maxfdp > childS ? maxfdp:childS+1;
}
.....
.....
if(maxfdp > 0){
.....
temp = &sockM;
do{
temp = temp->next;
switch(temp->sock.status){
....
case LOOKFOR:
if(FD_ISSET(temp->sock.socket,&writeList)){
send(temp->sock.socket, temp->sock.sendBuf, BUFSZ, 0);
if(!strcmp(temp->sock.command+4, "ls")){
char filePath[100] =
"/home/wind/software/eclipse/"
"eclipse2/server_multiaccess/wrPro3";
......
}
break;
......
}
}while(temp->next != NULL)
}
return EXIT_SUCCESS;
}
問題は次の3行です。
struct sockListEle sockC;
sockM.end = &sockC;
sockC.last->next = &sockC;
それらは、同じif内で、同じwhile内で3つすべてに見つかります。つまり、sockCはスタックに配置され、各ループ内で再利用されるため、エンドポイントのリスト内のすべての要素は常に1つの同じsockCを指します。そして、それを変更する場合(おそらくacceptを呼び出すことによって)、すべてのリスト要素に対して表示される唯一のインスタンスを変更します。
代わりに、ソケットごとに個別のメモリを割り当てる必要があります。
struct sockListEle* sockC = (struct sockListEle*) malloc(sizeof(struct sockListEle));
ポインタを直接割り当てます(演算子&のアドレスなし)。必要がなくなったらすぐにメモリを解放することを忘れないでください。そうしないと、メモリリークが発生します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加