{
HANDLE hFile=NULL;
DWORD dwWrite,dwFileSize;
TCHAR szFileName[MAX_PATH];
FD_ZERO(&FdRead);
FD_SET(sck,&FdRead);
while(TRUE)
{
ret_no=select(0,&FdRead,NULL,NULL,NULL);
if(ret_no==SOCKET_ERROR)
{
closesocket(sck);
return FALSE;
}
if(FD_ISSET(sck,&FdRead))
{
iAddrSize=sizeof(client);
sc=accept(sck,(SOCKADDR *)&client,&iAddrSize);
if(sc==INVALID_SOCKET)
{
MessageBox(NULL,"accept error",NULL,MB_OK);
closesocket(sc);
WSACleanup();
}
getpeername(sck,(SOCKADDR *)&client,&iAddrSize);
ShowMessage(inet_ntoa(client.sin_addr));
FD_SET(sc,&FdRead);
}
if(FD_ISSET(sc,&FdRead))
{
ZeroMemory(szBuf,sizeof(szBuf));
if((dwFileSize=recv(sc,szBuf,BUFFSIZE,0))==SOCKET_ERROR)
{
closesocket(sc);
CloseHandle(hFile);
return FALSE;
}
else if((strncmp(szBuf,"UPFILE_",lstrlen("UPFILE_")))==0)
{
wsprintf(szFileName,"c:\\%s",szBuf);
hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Server Open File Error",NULL,MB_OK);
return FALSE;
}
ZeroMemory(szBuf,sizeof(szBuf));
}
else
WriteFile(hFile,szBuf,dwFileSize,&dwWrite,NULL);
}
}
CloseHandle(hFile);
return TRUE;
}
//---------------------------------------------------------------------------
// WriteClient
// 发送文件数据线程,每次预读1K数据,根据实际读取发送,直到读取数据小于1K
//---------------------------------------------------------------------------
DWORD WINAPI WriteClient(LPVOID szFileName)
{
HANDLE hFile;
DWORD dwRead,dwNdx;
BOOL bRet;
TCHAR szFileBuff[BUFFSIZE],szSend[MAX_PATH];
wsprintf(szSend,"DOWNFILE_%s",ExtractFileName((LPCTSTR)szFileName).c_str());
send(sc,szSend,lstrlen(szSend),0);
hFile=CreateFile((LPCTSTR)szFileName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Open File Error",NULL,MB_OK);
ExitProcess(0);
}
do
{
bRet=ReadFile(hFile,szFileBuff,BUFFSIZE,&dwRead,NULL);
if(bRet==FALSE)
{
MessageBox(NULL,"Read Buf ERROR!",NULL,MB_OK);
break;
}
else if(dwRead==0)
{
MessageBox(NULL,"File EOF!",NULL,MB_OK);
break;
}
else
{
send(sc,szFileBuff,dwRead,0);
}
}while(dwRead==BUFFSIZE);
CloseHandle(hFile);
return TRUE;
}
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;
if(WSAStartup(MAKEWORD(1,1),&wsaData)!=NULL)
{
ShowMessage("初始化WINSOCK错误");
WSACleanup();
}
if((sck=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
{
ShowMessage("SOCKET错误");
closesocket(sck);
WSACleanup();
}
to.sin_family=AF_INET;
to.sin_port=htons(926);
to.sin_addr.s_addr=htonl(INADDR_ANY);
if(setsockopt(sck,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&flag,sizeof(flag))==SOCKET_ERROR)
{
ShowMessage("setsockopt error!");
closesocket(sck);
}
if(bind(sck,(struct sockaddr *)&to,sizeof(to))==SOCKET_ERROR)
{
ShowMessage("Could not bind");
closesocket(sck);
}
else
{
listen(sck,1);
hThread=CreateThread(NULL,0,ReadClient,(LPVOID)0,0,&dwTid);
CloseHandle(hThread);
}
}
//-------------------------------------------------
//-------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
DWORD WINAPI ReadClient(LPVOID lParam)
{
HANDLE hFile;
DWORD dwWrite,dwFileSize;
TCHAR szFileName[MAX_PATH];
TCHAR szBuff[BUFFSIZE];
FD_ZERO(&FdRead);
FD_SET(sck,&FdRead);
while(TRUE)
{
ret=select(0,&FdRead,NULL,NULL,NULL);
if(ret==SOCKET_ERROR)
{
closesocket(sck);
return FALSE;
}
else if(FD_ISSET(sck,&FdRead))
{
ZeroMemory(szBuff,sizeof(szBuff));
if((dwFileSize=recv(sck,szBuff,BUFFSIZE,0))==SOCKET_ERROR)
{
closesocket(sck);
CloseHandle(hFile);
return FALSE;
}
else if((strncmp(szBuff,"DOWNFILE_",lstrlen("DOWNFILE_")))==0)
{
wsprintf(szFileName,"c:\\%s",szBuff);
hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,
NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Cli Open File Error",NULL,MB_OK);
return FALSE;
}
ZeroMemory(szBuff,sizeof(szBuff));
}
else
WriteFile(hFile,szBuff,dwFileSize,&dwWrite,NULL);
}
}
return TRUE;
}
// WriteClient
// 发送文件数据线程,每次预读1K数据,根据实际读取发送,直到读取数据小于1K
//---------------------------------------------------------------------------
DWORD WINAPI WriteClient(LPVOID szFileName)
{
HANDLE hFile;
DWORD dwRead,dwNdx;
BOOL bRet;
TCHAR szFileBuff[BUFFSIZE],szSend[MAX_PATH];
wsprintf(szSend,"UPFILE_%s",ExtractFileName((LPCTSTR)szFileName).c_str());
send(sck,szSend,lstrlen(szSend),0);
hFile=CreateFile((LPCTSTR)szFileName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|
FILE_ATTRIBUTE_ARCHIVE,(HANDLE)NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,"Open File Error",NULL,MB_OK);
ExitProcess(0);
}
do
{
bRet=ReadFile(hFile,szFileBuff,BUFFSIZE,&dwRead,NULL);
if(bRet==FALSE)
{
MessageBox(NULL,"Read Buf ERROR!",NULL,MB_OK);
break;
}
else if(dwRead==0)
{
MessageBox(NULL,"File EOF!",NULL,MB_OK);
break;
}
else
{
send(sck,szFileBuff,dwRead,0);
}
}while(dwRead==BUFFSIZE);
CloseHandle(hFile);
return TRUE;
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;
WSAStartup(MAKEWORD(1,1),&wsa);
sck=socket(AF_INET,SOCK_STREAM,0);
if(sck==INVALID_SOCKET)
{
ShowMessage("Could not create a sock");
ExitProcess(0);
}
else
{
host=gethostbyname(Edit1->Text.c_str());
tto.sin_family=AF_INET;
tto.sin_port=htons(port);
CopyMemory(&tto.sin_addr,host->h_addr,host->h_length);
if((connect(sck,(struct sockaddr FAR *)&tto,sizeof(tto))==SOCKET_ERROR))
{
ShowMessage("connect error!");
closesocket(sck);
}
else
{
hThread=CreateThread(NULL,0,ReadClient,(LPVOID)0,0,&dwTid);
CloseHandle(hThread);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
HANDLE hThread;
DWORD dwTid;
if(OpenDialog1->Execute())
{
hThread=CreateThread(NULL,0,WriteClient,(LPVOID)OpenDialog1->FileName.c_str(),0,&dwTid);
CloseHandle(hThread);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
}
//---------------------------------------------------------------------------
帮我解释一下上面的几个函数的具体用法:
1。socket(AF_INET,SOCK_STREAM,0)
是打开一个套接字,为什么不指定套接字号? 如:0x8000
2.setsockopt()具体作用
3.bind()是如何绑定ip的?客户端为什么不用bind函数?
4.ctreatethread 为什么要用readClient函数为DWORD WINAPI
DWORD WINAPI 作用什么?
有没有中文解释?英文解释不是很明白
11 个解决方案
#1
这是贾佳写的代码,找本书或Windows Socket Api资料看看吧,网上很多的。
#2
看《网络编程技术》
#3
1、套接字号在bind的时候由bind()的第二个参数指定
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
#4
WINAPI具体含义我也不知道
我的看法是:winmain函数、dll的入口函数都是winapi类型的。
createthread是用来新建一个线程的,一个线程的入口函数是不是必须时winapi类型的。
我的看法是:winmain函数、dll的入口函数都是winapi类型的。
createthread是用来新建一个线程的,一个线程的入口函数是不是必须时winapi类型的。
#5
1。socket(AF_INET,SOCK_STREAM,0)是创建一个套接字,并不是打开一个套接字,创建只是分配一些系统资源,所以不需要指定Port。
2.setsockopt()是设定SOCKET的工作模式,工作模式有阻塞模式和非阻塞模式两种。当SOCKET工作在阻塞模式下是,当进行recv或send时,如果SOCKET此时无数据可读或者不能写时,函数将会阻塞等待不回返回一直到读写完成为止。如果工作在非阻塞模式,则必须在recv或者send之前用select判断SOCKET是可读或可写再进行操作。
3.服务器端要监听连接请求,必须用bind()将一SOCKET绑定到一IP地址和一端口,客户段只要发连接请求,所以不许进行绑定。
4.ctreatethread必须使用DWORD WINAPI ThreadFunc( LPVOID )形式的函数作为入口函数。
你的问题主要设计Winsock和多线程编程两方面,一时半会根本讲不清楚,建议你还是自己多看看资料。推荐《网络编程技术》和侯捷的《WIN32多线程编程》
2.setsockopt()是设定SOCKET的工作模式,工作模式有阻塞模式和非阻塞模式两种。当SOCKET工作在阻塞模式下是,当进行recv或send时,如果SOCKET此时无数据可读或者不能写时,函数将会阻塞等待不回返回一直到读写完成为止。如果工作在非阻塞模式,则必须在recv或者send之前用select判断SOCKET是可读或可写再进行操作。
3.服务器端要监听连接请求,必须用bind()将一SOCKET绑定到一IP地址和一端口,客户段只要发连接请求,所以不许进行绑定。
4.ctreatethread必须使用DWORD WINAPI ThreadFunc( LPVOID )形式的函数作为入口函数。
你的问题主要设计Winsock和多线程编程两方面,一时半会根本讲不清楚,建议你还是自己多看看资料。推荐《网络编程技术》和侯捷的《WIN32多线程编程》
#6
客户端为什么不可以用bind函数?
怪不得我上次的那个例子没成功?可我看书上client也用了bind()呀!
怪不得我上次的那个例子没成功?可我看书上client也用了bind()呀!
#7
To JamesJiang
请问您!那本 网络编程技术 有没有电子版要是有可以告诉我吗!!!谢谢了,我很需要这方面的知识
请问您!那本 网络编程技术 有没有电子版要是有可以告诉我吗!!!谢谢了,我很需要这方面的知识
#8
To JamesJiang
请问那本 网络变成技术 有没有电子版,我很需要这方面的知识,或者告诉我在那可以买的到。谢谢了
请问那本 网络变成技术 有没有电子版,我很需要这方面的知识,或者告诉我在那可以买的到。谢谢了
#9
电子版的有,我以前下过,不过可惜我才找了下,没有找到,遗憾,所以不能给你了。
int bind (SOCKET S,
const strucet sockaddr Far *name,
int namelen0);
当socket被创建以后,套接字数据结构中有一个默认的ip地址和默认的端口号,一个服务程序必须调用bind来给你绑定一个ip地址和一个特定的端口号,才能对起通信,因为它是被动的,需要用来监听,而client一般不需要。
int bind (SOCKET S,
const strucet sockaddr Far *name,
int namelen0);
当socket被创建以后,套接字数据结构中有一个默认的ip地址和默认的端口号,一个服务程序必须调用bind来给你绑定一个ip地址和一个特定的端口号,才能对起通信,因为它是被动的,需要用来监听,而client一般不需要。
#10
能把你有的发给我吗?谢谢了
zfjacky19@sohu.com
zfjacky19@sohu.com
#11
能不能也给我一份,要分我可以给
xi8kuang@sina.com
xi8kuang@sina.com
#1
这是贾佳写的代码,找本书或Windows Socket Api资料看看吧,网上很多的。
#2
看《网络编程技术》
#3
1、套接字号在bind的时候由bind()的第二个参数指定
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
int bind(
SOCKET s,
const struct sockaddr FAR *name,
int namelen
);
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bind函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
#4
WINAPI具体含义我也不知道
我的看法是:winmain函数、dll的入口函数都是winapi类型的。
createthread是用来新建一个线程的,一个线程的入口函数是不是必须时winapi类型的。
我的看法是:winmain函数、dll的入口函数都是winapi类型的。
createthread是用来新建一个线程的,一个线程的入口函数是不是必须时winapi类型的。
#5
1。socket(AF_INET,SOCK_STREAM,0)是创建一个套接字,并不是打开一个套接字,创建只是分配一些系统资源,所以不需要指定Port。
2.setsockopt()是设定SOCKET的工作模式,工作模式有阻塞模式和非阻塞模式两种。当SOCKET工作在阻塞模式下是,当进行recv或send时,如果SOCKET此时无数据可读或者不能写时,函数将会阻塞等待不回返回一直到读写完成为止。如果工作在非阻塞模式,则必须在recv或者send之前用select判断SOCKET是可读或可写再进行操作。
3.服务器端要监听连接请求,必须用bind()将一SOCKET绑定到一IP地址和一端口,客户段只要发连接请求,所以不许进行绑定。
4.ctreatethread必须使用DWORD WINAPI ThreadFunc( LPVOID )形式的函数作为入口函数。
你的问题主要设计Winsock和多线程编程两方面,一时半会根本讲不清楚,建议你还是自己多看看资料。推荐《网络编程技术》和侯捷的《WIN32多线程编程》
2.setsockopt()是设定SOCKET的工作模式,工作模式有阻塞模式和非阻塞模式两种。当SOCKET工作在阻塞模式下是,当进行recv或send时,如果SOCKET此时无数据可读或者不能写时,函数将会阻塞等待不回返回一直到读写完成为止。如果工作在非阻塞模式,则必须在recv或者send之前用select判断SOCKET是可读或可写再进行操作。
3.服务器端要监听连接请求,必须用bind()将一SOCKET绑定到一IP地址和一端口,客户段只要发连接请求,所以不许进行绑定。
4.ctreatethread必须使用DWORD WINAPI ThreadFunc( LPVOID )形式的函数作为入口函数。
你的问题主要设计Winsock和多线程编程两方面,一时半会根本讲不清楚,建议你还是自己多看看资料。推荐《网络编程技术》和侯捷的《WIN32多线程编程》
#6
客户端为什么不可以用bind函数?
怪不得我上次的那个例子没成功?可我看书上client也用了bind()呀!
怪不得我上次的那个例子没成功?可我看书上client也用了bind()呀!
#7
To JamesJiang
请问您!那本 网络编程技术 有没有电子版要是有可以告诉我吗!!!谢谢了,我很需要这方面的知识
请问您!那本 网络编程技术 有没有电子版要是有可以告诉我吗!!!谢谢了,我很需要这方面的知识
#8
To JamesJiang
请问那本 网络变成技术 有没有电子版,我很需要这方面的知识,或者告诉我在那可以买的到。谢谢了
请问那本 网络变成技术 有没有电子版,我很需要这方面的知识,或者告诉我在那可以买的到。谢谢了
#9
电子版的有,我以前下过,不过可惜我才找了下,没有找到,遗憾,所以不能给你了。
int bind (SOCKET S,
const strucet sockaddr Far *name,
int namelen0);
当socket被创建以后,套接字数据结构中有一个默认的ip地址和默认的端口号,一个服务程序必须调用bind来给你绑定一个ip地址和一个特定的端口号,才能对起通信,因为它是被动的,需要用来监听,而client一般不需要。
int bind (SOCKET S,
const strucet sockaddr Far *name,
int namelen0);
当socket被创建以后,套接字数据结构中有一个默认的ip地址和默认的端口号,一个服务程序必须调用bind来给你绑定一个ip地址和一个特定的端口号,才能对起通信,因为它是被动的,需要用来监听,而client一般不需要。
#10
能把你有的发给我吗?谢谢了
zfjacky19@sohu.com
zfjacky19@sohu.com
#11
能不能也给我一份,要分我可以给
xi8kuang@sina.com
xi8kuang@sina.com