我目前正致力于Linux的SCTP服务器 - 客户端对,需要通过一个流发送文件。这是因为其他流将用于发送命令,遥测等。如果有帮助,我正在使用QT创建者。我要求使用SCTP。目前,服务器和客户端在本地端口上作为单独的应用程序运行。
以下是重要的代码段。客户端和服务器都在与各自的main()s分开的线程中运行,这允许将来进行额外的代码实现。
/*
*Server (Sending side):
*/
std::ifstream inFile("/home/username/test.png", std::ios::binary);
char buf[MAX_BUFFER+1];
while(inFile.read((char *)buf,sizeof(buf)))
{
//Sends the current buffer over stream 3
snd_ret = sctp_sendmsg( goodSock, (void *)buf, (size_t)strlen(buf),
NULL, 0, 0, 0, 3, 0, 0 );
/*
* in another thread there is a loop that receives messages
* the client side sends a message whenever it receives
* this ensures the data was sent and waits before sending more.
*/
while(confirmHandshake == false){/*...*/}
//delays so I can view and compare console outputs for debugging
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
我目前还使用ofstream将它读取的缓冲区写入单独的png中。这个方面在很大程度上起作用;它不会读取和写入整个文件,但这是我现在最不关心的问题。
/*
* Client (Recieving Side)
*/
//creates a file if it isn't there
std::ofstream file("write.png");
//instantiates ofstream
std::ofstream ofs;
//opens the file using binary, I've tried it with "| std::ios::out" too
ofs.open ("write.png", std::ios::binary);
//tried different buffer sizes, same results, currently set at 512
char inBuffer[MAX_BUFFER+1];
while(error != -1){
memset(inBuffer, 0, MAX_BUFFER+1);
in = sctp_recvmsg( connSock, (void *)inBuffer
, sizeof(inBuffer), (struct sockaddr *)NULL, 0
, &sndrcvinfo, &flags);
if( in != -1 && sndrcvinfo.sinfo_stream == 3){
//writes the buffer to the file every time it recieves
//I've tried changing the pointers around,
//also tried using sizeof() instead of strlen()
//this changed the results, nothing worked so far
ofs.write((char *)&inBuffer, strlen(inBuffer));
//sends a handhake message (stored in s_buffer) to server
snd_ret = sctp_sendmsg( connSock, (void *)s_buffer
,(size_t)strlen(s_buffer)
,NULL, 0, 0, 0, 4, 0, 0 );
}
}
我面临的问题是收到的数据与发送的数据不同。发送的数据似乎没问题,因为我可以将该缓冲区写入文件而不会损坏文件。 当我打开写在客户端的png时,无法显示图片,根据我在尝试调试时所做的不同更改,会出现各种错误。 我不确定数据在哪里变坏,是在套接字上还是在写文件。当我将两面打印到他们的控制台时,我得到的乱码ASCII表示看起来几乎相同。
我还想知道是否有更好的解决方案来读写文件。或者将不同类型的数据发送到(我认为\ n可能是一个问题)。我想可能尝试将文件转换为十六进制进行传输,并在其他所有方法都失败时转换回二进制文件。但是,我想尝试使用二进制文件。
我想知道另一件事:是否可以简单地使用socket.h&s发送和recv函数与sctp_sendmsg和sctp_recvmsg同时进行。我认为它只会挂起程序,但我对套接字协议没什么经验。
我也可以接受任何其他建议。只要它仍然使用带有流的SCTP。
谢谢!