gpt4 book ai didi

c++ - 如何将字节数据从套接字写入 C 中的无符号字符 vector ?

转载 作者:行者123 更新时间:2023-11-28 08:04:17 25 4
gpt4 key购买 nike

<分区>

我正在使用 bsd 套接字用 C 语言开发一个服务器,我在其中接收来自客户端的 jpeg 帧。

帧数据作为 jpeg 格式的字节数据流到达服务器。

由于等效字节在 C 中是 unsigned char,因此我通过 sock.recv() 函数的多次迭代将此数据接收到一个 unsigned char vector 中。

问题是当我将此数据写入 .jpg 文件时,它显示文件大小仅为 4 个字节。

我还检查了在帧的所有迭代中从 recv 缓冲区中选取的字节数是否等于发送帧的总大小,但不知何故它们没有正确写入我使用的 vector 中。

有人知道怎么做吗?谢谢 !

这是我从套接字读取数据的代码:

int Socket::readFrame(vector<unsigned char> &buffer,int buffsize){
MyLog Log;
buffer.resize(buffsize);
int nChars;
int readlen;
fd_set fset;
struct timeval tv;
int sockStatus;
FD_ZERO(&fset);
FD_SET(socketHandle, &fset);
tv.tv_sec = 0;
tv.tv_usec = 50;
sockStatus = select(socketHandle + 1, &fset, NULL,&fset, &tv);
if (sockStatus <= 0) {
return sockStatus;
}

int i;
for(i=0;i<buffsize;i+=nChars){
cout<<"I="<<i<<endl;
//Log.v("Reading");
FD_ZERO(&fset);
FD_SET(socketHandle, &fset);
tv.tv_sec = 5;
tv.tv_usec = 0;
sockStatus = select(socketHandle + 1, &fset, NULL,&fset, &tv);
if (sockStatus < 0) {
return -1;
}
nChars = ::recv(socketHandle, &buffer[0] , buffsize-i, MSG_NOSIGNAL);
cout<<nChars<<endl;
if (nChars <= 0) {
return -1;
}

}
cout<<buffer.data();
return i;
}

是的,我在服务器上正确接收数据,因为我还在 PYTHON 中创建了一个虚拟服务器并在那里成功地重建了帧。这是我在 python 中所做的:

import socket,thread
import string
import array
host="172.16.82.217"
port=54321
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(5)
conn,address=s.accept()
if conn:
print "accepted"
totalLength=""
for i in range(0,10):
data=""
mylen=0
dataRecv=0
file1 = open("myfile%d.jpg"%i,"w")
length=conn.recv(1024)
print length
conn.send("recvd\n")
mylen=int(length)

while dataRecv<mylen:
newData=""
newData=conn.recv(1)
if not newData:
break
data+=newData
dataRecv+=len(newData)

file1.write(data)
file1.close()
print len(data)
conn.close()
s.close()

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com