Я разрабатываю сервер в C, используя сокеты bsd, в которых я получаю jpeg-фреймы от клиентов.Как записать данные байта из сокета в неподписанный символ char в C?
Данные кадра поступают на сервер как поток байтовых данных формата jpeg.
Поскольку эквивалент байта - это символ без знака в C, я получаю эти данные в unsigned char vector над несколькими итерациями функции sock.recv().
Проблема в том, что когда я пишу эти данные в файл .jpg, он показывает размер файла только в 4 байта.
Я также проверил, что количество байтов, выбранных из буфера recv, для всех итераций для фрейма равно общему размеру отправленного кадра, но каким-то образом они неправильно написаны в векторе, который я использовал ,
Кто-нибудь знает, как это сделать? Спасибо !
Вот код, где я читать данные из сокета:
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;
}
да я получать данные на сервере правильно, как я также создал сервер dunmmy в Питоне и реконструированы кадры там успешно , Вот что я делаю в 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()
Можете ли вы разместить часть кода, который вы используете? Наиболее полезной будет часть, записывающая код в файл. –
Просто выстрел в темноте: вы закрываете выходной файл правильно? – m0skit0
Вы переписываете и не добавляете в свой файловый буфер. –