Client yêu cầu gửi file theo cú pháp: FILE\n.. Có thể chat và gửi file đồng thời.. Số lượng byte gửi đi = chiều dài xâu*2 Mỗi 1 kết nối phải duy trì 1 buffer, truyền dl theo từng byte và
Trang 11 Viết ct chat+gửi file đơn giản (client+server) sử dụng mô hình WSAEventSelect
Có thể nhập và hiển thị tiếng Việt không dấu Có quản lý username, password Client yêu cầu gửi file theo cú pháp: FILE<Tên File><Nickname>\n Hiển thị tiến
độ gửi file Có thể chat và gửi file đồng thời
Nội dung lưu trong xâu có kiểu wchar_t Số lượng byte gửi đi = chiều dài xâu*2
Mỗi 1 kết nối phải duy trì 1 buffer, truyền dl theo từng byte và khi gặp dấu \n nó sẽ thực hiện trọn vẹn 1 câu lệnh ở trong buffer, và đẩy phần còn lại lên đầu buffer
Giao thức TEXT BASED
2 Thiết kế và cài đặt một giao thức cho phép gửi file và văn bản đồng thời trên một kết nối TCP
3 Thiết kế và cài đặt một giao thức cho phép gửi file và văn bản đồng thời trên một kết nối UDP
Chia file thành các mẩu nhỏ gửi đi: file file txt file…
Giao thức: BINARI BASED
UDP: File<=1500 byte
Bài 1: FILE *fp;
Fp = fopen(“A.JPG”,”rb”);
Long long filelen = 0;
Fseek(fp,0,SEEK_END);
Filelen = ftell(fp); // kich thuoc tep tin
Fseek(fp,0,SEEK_SET);
Fread, fwrite
Bài 2:
Typedef struct_PACKET
SinhVienZone.Com
Trang 2{
DWORD bType;//00: Text, 01: Data, 02: File metadata
DWORD wLength; //Kich thuoc phan data cua Packet
BYTE bData[8192];
}
Typedef struct_FILE_METADATA
{
DWORD dwFileSize;
BYTE szFilename[256];
}
FILE_METADATA;
PACKET aPacket;
…
Gets(szXau);
aPacket.bType = 0;
aPacket.wLeng = strlen(szXau);
memcpy(aPacket.bData,szXau,aPacket.wLength);
Send(s,&aPacket,8+aPacket.wLength,0);
Recv(s,&aPacket,8,MSG_WAITALL);
…
Recv(s,aPacket.bData,aPacket.wLength,0);
SinhVienZone.Com
Trang 3…
Gui file metadata
FILE_METADATA fileMeta;
fileMeta.dwFileSize = 123;
strcpy(fileMeta.szFileName,”A.JPG”);
PACKET aPacket;
aPacket.bType =2; // File metadata
aPacket.wLength = sizeof(FILE_METADATA);
memcpy(aPacket.bData,&fileMeta,aPacket.wLength);
send(s,&aPacket,8+aPacket.wLength,0);
switch(aPacket.bType)
{
Case 00: // In ra man hinh cau chat;
Break;
Case 01: // ghi du lieu ra file
Break;
Case 02: // Hoi nguoi dung???
}
Bai 3:
SinhVienZone.Com
Trang 4Typedef struct_PACKET
{
DWORD bType;//00: Text, 01: Data, 02: File metadata
DWORD wLength; //Kich thuoc phan data cua Packet
DWORD dwChecksum;
DWORD dwOffset; //Offset cua du lieu trong file
BYTE bData[1400];
}
Typedef struct_FILE_METADATA
{
DWORD dwFileSize;
BYTE szFilename[256];
}
FILE_METADATA;
PACKET aPacket;
…
Gets(szXau);
aPacket.bType = 0;
aPacket.wLeng = strlen(szXau);
memcpy(aPacket.bData,szXau,aPacket.wLength);
Send(s,&aPacket,8+aPacket.wLength,0);
SinhVienZone.Com
Trang 5Recv(s,&aPacket,8,MSG_WAITALL);
…
Recv(s,aPacket.bData,aPacket.wLength,0);
…
Gui file metadata
FILE_METADATA fileMeta;
fileMeta.dwFileSize = 123;
strcpy(fileMeta.szFileName,”A.JPG”);
PACKET aPacket;
aPacket.bType =2; // File metadata
aPacket.wLength = sizeof(FILE_METADATA);
memcpy(aPacket.bData,&fileMeta,aPacket.wLength);
send(s,&aPacket,8+aPacket.wLength,0);
switch(aPacket.bType)
{
Case 00: // In ra man hinh cau chat;
Break;
Case 01: // ghi du lieu ra file
Break;
SinhVienZone.Com
Trang 6Case 02: // Hoi nguoi dung???
}
Chat: Xin chao
“\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00Xin chao”
Ket hop 2 bai: la su dung 1 socket, sdung ca 2 bai vao trong 1
SinhVienZone.Com