소켓 프로그래밍에서 구조체를 넘길 때 데이터가 안넘어옵니다.
글쓴이: 익명 사용자 / 작성시간: 목, 2021/12/02 - 2:59오후
소켓프로그래밍을 하는 도중 클라이언트와 서버 측 모두 동일한 구조체를 선언하였습니다
typedef struct s_connection { SOCKET sock; int index; int age; char mbti[4]; char rname[32]; char nick[32]; }Connection;
이러한 구조체를 클라이언트 측에서는
Connection client; //내용을 채우고 send(client.sock,(char*)&client, sizeof(client), 0);
이렇게 서버로 보내고 서버 측에서는
Connection *tmp; char buf[512]; int retval; retval = recv(client_sock, buf, 512, 0);//client_sock은 accept의 return 값을 받은 SOCKET입니다. buf[retval] = '\0';//잉여 데이터를 제거 tmp = (Connection*)buf;//구조체 대입 tmp->sock = client_sock;//통신 소켓 변경 tmp->index = client_count++;//인덱스 저장
이런 식으로 받아오는데 이때 rname 배열에 데이터가 하나도 안 채워진 채로 넘어옵니다.
클라이언트 측에서 32바이트를 다 채우고 보내도 strlen을 이용해서 \0을 넣어도
제가 할 수 있는 많은 방식을 시도 해봤지만 아무리 해도 다른 멤버들은 정상적으로 넘어오지만
rname에 아무런 데이터도 저장 되지 않은채로 넘어옵니다 ㅠ 조언 부탁드립니다.
Forums:

일단 send, recv 함수들 반환값 정도는 찍어서
일단 send, recv 함수들 반환값 정도는 찍어서 확인해 봅시다.
제가 테스트 해봤는데 정상적으로 동작합니다.
제가 테스트 해봤는데 정상적으로 동작합니다.
서버 코드
/* C socket server example */ #include<stdio.h> #include<string.h> //strlen #include<sys/socket.h> #include<arpa/inet.h> //inet_addr #include<unistd.h> //write typedef struct s_connection { int sock; int index; int age; char mbti[4]; char rname[32]; char nick[32]; }Connection; int main(int argc , char *argv[]) { int socket_desc , client_sock , c , read_size; struct sockaddr_in server , client; char client_message[2000]; //Create socket socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { printf("Could not create socket"); } puts("Socket created"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons( 8888 ); //Bind if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) { //print the error message perror("bind failed. Error"); return 1; } puts("bind done"); //Listen listen(socket_desc , 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); //accept connection from an incoming client client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); if (client_sock < 0) { perror("accept failed"); return 1; } puts("Connection accepted"); //Receive a message from client read_size = recv(client_sock , client_message , 2000 , 0); if(read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if(read_size == -1) { perror("recv failed"); } else if (read_size > 0) { client_message[read_size] = '\0'; } Connection* tmp = (Connection*)client_message; printf("name : %s\n", tmp->rname); return 0; }클라이언트 코드
/* C client example using sockets */ #include <stdio.h> //printf #include <string.h> //strlen #include <sys/socket.h> //socket #include <arpa/inet.h> //inet_addr #include <unistd.h> typedef struct s_connection { int sock; int index; int age; char mbti[4]; char rname[32]; char nick[32]; }Connection; int main(int argc , char *argv[]) { int sock; struct sockaddr_in server; char message[1000] , server_reply[2000]; //Create socket sock = socket(AF_INET , SOCK_STREAM , 0); if (sock == -1) { printf("Could not create socket"); } puts("Socket created"); server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons( 8888 ); //Connect to remote server if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } puts("Connected\n"); Connection client; strcpy(client.rname, "test"); //Send some data if( send(sock , (char*)&client , sizeof(client) , 0) < 0) { puts("Send failed"); return 1; } close(sock); return 0; }클라이언트 실행 결과
서버 실행 결과
테스트는 리눅스에서 했습니다.
댓글 달기