Sctp文件(png)通过单个流

时间:2016-11-18 20:41:16

标签: c++ linux sockets png sctp

我目前正致力于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。

谢谢!

0 个答案:

没有答案