tcp 구조체 전송 질문입니다.
안녕하세요. 제가 tcp 서버를 작성하고 있는데요..
으윽 계속 안개속이예요ㅠㅠ
문제는 서버와 클라이언트가 reqinfo라는 구조체를 주고 받는데
거기서 opcode가 1이면 서버에서 recvbuf를 읽어서
다시 클라이언트에게 전송하는 겁니다.
그런데 자꾸 recvbuf가 256만큼 읽어지지 않고 10바이트 정도 잘려서 읽어오고 맙니다.
클라이언트에서 보낸 recvbuf에 있는 내용을 다 읽으려면 어떻게 해야하나요?
ps. 저는 read가 한꺼번에 다 못읽을 경우 반복해서 읽어야 한다는 것을 보았는데요..
그냥 문자열만 주고받으면 할 수 있을거 같은데
구조체에 있는 문자열을 읽어와야 해서 더 헷갈립니다.
조언 부탁드립니다.
///Echo server
#include
#include
#include
#include
#include
#include
#include
#define BUF_SIZE 256
struct reqinfo {
int opcode;
char recvbuf[BUF_SIZE];
};
int main(int argc, char *argv[])
{
int listenfd, connfd;
struct sockaddr_in cliaddr, servaddr;
int str_len;
socklen_t addr_size;
//소켓생성
//바인드
//리슨
//accept
//receive and write
while( read(connfd, &(info),sizeof(struct reqinfo) ) > 0) //**
{
//opcode check
if(info.opcode==1){
printf("from client:%s", info.recvbuf); //**
write(connfd, &(info), sizeof(struct reqinfo));
memset(&recvbuf, 0, sizeof(recvbuf));
}else{
printf("opcode is not 1\n");
}
}
}
원하는 만큼 읽어 오실려면....
아마 sizeof(struct reqinfo)의 길이만큼 읽어 와야 하는데 위 소스에서는
while문의 의미가 없군요....read()는 일단 읽어 온 바이트 길이를 반환하는데
"while( read(connfd, &(info),sizeof(struct reqinfo) ) > 0)"게 하시면...
한번밖에 루프를 돌지 않습니다. read()가 10만큼 읽어 오든 240만큼 읽어 오든 0보다는
큰 값이기에 read가 한번 밖에 수행이 안되어서 원하는 길이 만큼 다 읽어 오지 못하는데 문제가 있습니다.
char buf[MAXSIZE];
int read_len = 0;
int size = sizeof(struct reqinfo);
while( read_len += read(connfd, buf + read_len, size - read_len)
{
if(read_len == size)
break;
}
요렇게 하면 원하는 만큼 읽겠죠...
ps. 위소스에서 info 정의가 안보이는 군요...구조체 포인터로 보입니다만...-_-;
============================
Stay Hungry, Stay Foolish
============================
Stay Hungry, Stay Foolish
댓글 달기