1. 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.
om
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
ne
.C
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.
Bài 1: FILE *fp;
Vi
UDP: File<=1500 byte
en
Giao thức: BINARI BASED
Zo
Chia file thành các mẩu nhỏ gửi đi: file file txt file….
nh
Fp = fopen(“A.JPG”,”rb”);
Si
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
/>
{
DWORD
bType;//00: Text, 01: Data, 02: File metadata
DWORD
wLength; //Kich thuoc phan data cua Packet
BYTE
bData[8192];
}
om
Typedef struct_FILE_METADATA
dwFileSize;
BYTE
szFilename[256];
ne
DWORD
.C
{
Zo
}
aPacket;
Vi
PACKET
en
FILE_METADATA;
Gets(szXau);
nh
…
Si
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
/>
…..
Gui file metadata
FILE_METADATA
fileMeta;
fileMeta.dwFileSize = 123;
aPacket;
aPacket.bType =2; // File metadata
ne
aPacket.wLength = sizeof(FILE_METADATA);
.C
PACKET
om
strcpy(fileMeta.szFileName,”A.JPG”);
Zo
memcpy(aPacket.bData,&fileMeta,aPacket.wLength);
Vi
en
send(s,&aPacket,8+aPacket.wLength,0);
nh
switch(aPacket.bType)
{
Si
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
/>
Typedef struct_PACKET
{
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];
om
DWORD
.C
}
ne
Typedef struct_FILE_METADATA
dwFileSize;
BYTE
szFilename[256];
en
DWORD
aPacket;
Si
PACKET
nh
FILE_METADATA;
Vi
}
…
Zo
{
Gets(szXau);
aPacket.bType = 0;
aPacket.wLeng = strlen(szXau);
memcpy(aPacket.bData,szXau,aPacket.wLength);
Send(s,&aPacket,8+aPacket.wLength,0);
SinhVienZone.com
/>
Recv(s,&aPacket,8,MSG_WAITALL);
…..
Recv(s,aPacket.bData,aPacket.wLength,0);
…..
Gui file metadata
fileMeta;
om
FILE_METADATA
fileMeta.dwFileSize = 123;
ne
aPacket;
aPacket.bType =2; // File metadata
Zo
PACKET
.C
strcpy(fileMeta.szFileName,”A.JPG”);
en
aPacket.wLength = sizeof(FILE_METADATA);
nh
Vi
memcpy(aPacket.bData,&fileMeta,aPacket.wLength);
Si
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
/>
Case 02: // Hoi nguoi dung???
}
Chat: Xin chao
om
“\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00Xin chao”
Si
nh
Vi
en
Zo
ne
.C
Ket hop 2 bai: la su dung 1 socket, sdung ca 2 bai vao trong 1.
SinhVienZone.com
/>