문제

나는 사용 중입니다 C 언어 그것은 a입니다 일반적인 플랫폼 서버와 클라이언트 모두

서버에서 클라이언트에게 보내고 싶은 특정 유형의 구조가 있습니다.

예를 들어

서버 코드

 //necessary declarations

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,&hp,sizeof(hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

클라이언트 코드

struct hostent *hp;

msg=recvfrom(mysock,&hp,sizeof(hp),0,(struct sockaddr)&serv_addr,&size_len);

기본적으로 서버에서 클라이언트로 구조를 보내고 싶습니다. 그러나 위의 코드에서 나는 세분화 결함을 얻고 있으며, 그러한 구조 전달이 가능한지 확실하지 않습니다. 나가는 방법이 있습니까?

도움이 되었습니까?

해결책

먼저, 구조체 호스턴에 대한 메모리를 할당하려면 malloc ()를해야합니다. sendto ()/recvfrom ()을 통해 구조물을 전송할 수 있지만 struct hostent에는 포인터가 포함되어 있으므로 포인터 인이 구조물의 구성원은 다른 쪽 끝으로 전달되는 즉시 의미가 없습니다.

다른 팁

HP 앞에서 &를 제거했습니다

일반적으로 네트워크 전송으로 사용하도록 특별히 설계되지 않았거나 양쪽 끝이 항상 동일한 아키텍처가 될 것이라고 확신하지 않는 한 네트워크를 통해 원시 구조를 전송하지 않기를 원합니다. 패딩과 바이트 순서의 차이로 인해 다른 쪽 끝에 데이터가 차단 될 수 있습니다. 전송하려는 특정 유형의 구조물은 원시를 보내지 않습니다 (Petros의 답변 참조).

보내기 코드의 문제점은 HP가 포인터이며 지적한 데이터처럼 취급한다는 것입니다. 크기 (HP)는 뾰족한 호스팅 구조물의 크기가 아닌 포인터의 크기를 반환합니다. 또한, 당신은 당신이 의미하지 않을 때 Sendto의 두 번째 인수에서 포인터 투 포인터를 만들고 있습니다. 보내는 코드는 다음을 읽어야합니다.

struct hostent *hp;

hp=gethostbyname("www.google.com");

sendto(sockDes,hp,sizeof(*hp),0,(struct sockaddr *)&cli_addr,sizeof(cli_addr));

또한 수신 코드에 문제가 있습니다. 수신 된 데이터를 저장할 공간을 할당해야합니다. 그것은 당신을 위해 그것을 할당하지 않습니다. 수신 코드를이 두 가지 중 하나로 변경하십시오.

// Store on the stack
struct hostent h;

msg=recvfrom(mysock,&h,sizeof(h),0,(struct sockaddr)&serv_addr,&size_len);

또는

// Store on the heap, be sure to free() when done
struct hostent * hp = malloc(sizeof(struct hostent));

msg=recvfrom(mysock,hp,sizeof(*hp),0,(struct sockaddr)&serv_addr,&size_len);

HP가 포인터 인 경우 왜 주소를 취하고 있습니까?

아래와 같이 코드를 수정해야합니다.

struct hostent *p_hp = gethostbyname("www.google.com");
struct sockaddr_in cli_addr;
sendto(sockDes,p_hp,sizeof(hostent),0,(SOCKADDR *)&cli_addr,sizeof(cli_addr));


struct hostent hp;
struct sockaddr_in serv_addr;
int size_serv_addr = sizeof(serv_addr);
msg=recvfrom(mysock,&hp,sizeof(hostent),0,(SOCKADDR *)&serv_addr,&size_serv_addr);

소켓 기능에 대한 문서를 항상 읽는 데 도움이됩니다.

그건 그렇고, 귀하의 게시물에서 매우 일반적인 질문을 고려하면 "서버에서 클라이언트로 구조를 보내고 싶습니다"라는 다음 게시물을 보는 것이 좋습니다.

c.의 소켓을 통해 구조를 전달합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top