【发布时间】:2014-06-29 23:52:04
【问题描述】:
我正在制作一个通过套接字传递结构的 C 程序
这是我的结构
typedef struct{
char type; //message type
char* sender; //sender
char* receiver; //receiver
unsigned int msglen; //msg length
char* msg; //text
} msg_t;
这是我的发送功能:
void send_message(int socket, char* msg)
{
msg_t message;
bzero(&message,sizeof(message));
message.msg = msg;
if(send(socket,&message,sizeof(msg_t),0) < 0)
{
perror("ERROR: send fail\n");
}
}
这是我的接收函数:
msg_t rec_message(int socket)
{
msg_t buff;
bzero(&buff,sizeof(buff));
if(recv(socket,&buff,sizeof(buff),0) < 0)
{
perror("ERROR: receive failed\n");
}
return buff;
}
当我像字符串一样发送消息时,一切正常,但是当我切换到结构时,客户端似乎发送消息然后给我这个:
ERROR: receive failed: connection reset by peer
和服务器这个:
ERROR: receive failed: invalid argument
我做错了什么?
【问题讨论】:
-
将指针从一个进程发送到另一个进程并不是一个好主意。
-
您是否为希望接收的数据分配了内存? char* msg 需要分配
length字节。还有其他需要处理的事情.. -
recv() 返回一些你必须注意的感兴趣的东西,即使它是积极的。 TCP 是一个字节流 - 它对您的 msg_t 结构一无所知,如果您不在 TCP 之上使用某些协议,它将被切片。
-
几点:“对等连接重置”真的发生在recv上,还是一个错字?您是否使用
SOCK_SEQPACKET或SOCK_DGRAM来保留消息边界(您应该,以及很可能sendmsg()/recvmsg())?最后,您的服务器很可能在您的rec_message()呼叫之外的某个地方断开连接。失败的read()/recv()不应该自己踩踏套接字。