最近关注这方面的知识,自己在做一些尝试,自己定义数据包格式,按type类型判断重新传递还是续传。经测试,基本功能都不错,传递速度是radim的4倍多。另因工作关系,一些异常判断未在此处列出。
主要源码如下:
服务端:
//
server.cpp : Defines the entry point for the console application.
//
#include
"
stdafx.h
"
#include
<
afx.h
>
#include
"
winsock2.h
"
#include
"
winbase.h
"
#define
SIZE 20;

#pragma
comment(lib, "ws2_32.lib")

int
readn(SOCKET fd,
char
*
bp,
int
len);
int
sendn(SOCKET fd,
char
*
bp,
int
len);
DWORD WINAPI clientthread(LPVOID lpparam);

//
文件信息
struct
fileinfo

...
{
int fileno;//文件号
int type;//消息类别。有三种有效的取值:0/1/2
long len;//文件长度
int seek;//开始位置
char name[100];//文件名
}
;

struct
filesendinfo

...
{
char name[100];
int length;//INT,32位的数据。所以,应该占四个字节。
int date;
}
;

int
main(
int
argc,
char
*
argv[])

...
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr,ClientAddr;
int ClientAddrLen;
int port = 1863;

WSAStartup(MAKEWORD(2,2),&wsaData);

ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(port);
ServerAddr.sin_addr.s_addr = htons(INADDR_ANY);

bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr));

listen(ListeningSocket,30);

while(1)

...{
ClientAddrLen=sizeof(ClientAddr);
NewConnection = accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen);
char buffer[20];
_itoa(NewConnection,buffer,20);
printf("创建连接套按字:");
printf(buffer);
if(INVALID_SOCKET!=NewConnection)

...{
//创建客戶功能线程,將NewConnection套接字傳給新線程
HANDLE hThread;
DWORD dwThread;
hThread=CreateThread(NULL,0,clientthread,(LPVOID)NewConnection,0,NULL);
if(hThread==NULL)

...{
printf("CreatThread clientthread() failed. ");
}
else

...{
printf("CreateThread OK. ");
}

CloseHandle(hThread);

}
closesocket(NewConnection);
}

//closesocket(ListeningSocket);
WSACleanup();
return 0;
}


//
----------------------------------------------------------------
//
“用来处理服务器与客户端的一次连接用的线程”的线程函数。
//
其参数是:连接用的socket。
DWORD WINAPI clientthread(LPVOID lpparam)

...
{
//文件消息
fileinfo fiinfo;
SOCKET sConnect1=(SOCKET)lpparam;
char