Socket Api 函数问题,送分了 200分 快来看看

时间:2022-05-11 00:27:56
DWORD WINAPI ReadClient(LPVOID lPort) 

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]; 
       };

#4


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多线程编程》

#6


客户端为什么不可以用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一般不需要。

#10


能把你有的发给我吗?谢谢了

     zfjacky19@sohu.com

#11


能不能也给我一份,要分我可以给
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]; 
       };

#4


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多线程编程》

#6


客户端为什么不可以用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一般不需要。

#10


能把你有的发给我吗?谢谢了

     zfjacky19@sohu.com

#11


能不能也给我一份,要分我可以给
xi8kuang@sina.com