這是我的TFTP程序中的一個函數,是搜索當前盤符下的所有文件,包括文件的大小,并發送到客戶端,其中就有查找當前路徑下的文件,你自己挑一下,應該能完成你的需求。
創新互聯建站專注于企業成都全網營銷、網站重做改版、阿爾山網站定制設計、自適應品牌網站建設、H5頁面制作、商城開發、集團公司官網建設、外貿網站制作、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為阿爾山等各大城市提供網站開發制作服務。
void FileList(sockaddr_in sour_addr,char strStartDir[])
{
char sendbuffer[1024];
sockaddr_in destaddr;
int sourlen = 0;
int ret = 0;
int len = 0;
int flen = 0;
fd_set fdr;
unsigned short blocknum = 0;
FILE *file;
char filename[128];
strcpy(filename,strStartDir+2); /*獲取文件名*/
strcat(filename,"\\*");
destaddr.sin_family = AF_INET;
destaddr.sin_port = sour_addr.sin_port;
destaddr.sin_addr.s_addr = inet_addr(desthost);//
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(filename, FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("Invalid File Handle");
}
else
{
while(FindNextFile(hFind,FindFileData))
{
printf(FindFileData.cFileName);
printf("\r\n");
memset(sendbuffer,'\0',1024);
len = filldata(blocknum++,FindFileData.cFileName,strlen(FindFileData.cFileName),sendbuffer,sizeof(sendbuffer));
ret = sendto(serverSock,sendbuffer,len,0,(sockaddr *)destaddr,sizeof(destaddr));
}
len = fillover(blocknum,"Over",4,sendbuffer,sizeof(sendbuffer));
ret = sendto(serverSock,sendbuffer,len,0,(sockaddr *)destaddr,sizeof(destaddr));
FindClose(hFind);
return;
}
}
服務器:
#includestdio.h
#includewinsock.h
#pragma comment (lib,"wsock32.lib")
void main()
{
WSADATA data;
WSAStartup(MAKEWORD(2,0),data);
SOCKET socket1;
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(1000); ///監聽端口
local.sin_addr.s_addr=INADDR_ANY; ///本機
socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)local,sizeof local);
while (1)
{
char buffer[1024]="\0";
printf("waiting for message from others-------------\n");
if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)from,fromlen)!=SOCKET_ERROR)
{
printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
////給cilent發信息
sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)from,fromlen);
}
}
closesocket(socket1);
WSACleanup();
}
客戶端:
#includestdio.h
#includewinsock.h
#pragma comment (lib,"wsock32.lib")
void main()
{
WSADATA data;
WSAStartup(MAKEWORD(2,0),data);
SOCKET socket1;
struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(1000); ///server的監聽端口
server.sin_addr.s_addr=inet_addr("???.???.???.???"); ///server的地址
socket1=socket(AF_INET,SOCK_DGRAM,0);
while (1)
{
char buffer[1024]="\0";
printf("input message\n");
scanf("%s",buffer);
if (strcmp(buffer,"bye")==0)
break;
if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)server,len)!=SOCKET_ERROR)
{
if (recvfrom(socket1,
buffer,
sizeof buffer,
0,
(struct sockaddr*)server,len) != SOCKET_ERROR)
printf("rece from server:%s\n",buffer);
}
}
closesocket(socket1);
WSACleanup();
}
write/read,是關于寫特定的文件描述符使用的比較底層的系統調用,
sendto/recvfrom適用于用udp(數據包)方式的套接字中使用的,
其他的沒見過,我是學linux編程的
Windows下的socket和Linux下的socket是不一樣的,我沒有查到sendmsg/recvmsg這個方法,上面的鏈接是一個類似的函數,它和send/recv 的區別是,這個函數可以發送socket控制信息,看API就知道。
另外我也沒有看到有write/read函數。 sendto/recvfrom用于UDP鏈接,send/recv用于TCP鏈接。
你列舉的其余函數,我都沒找到。下面的API地址供樓主查詢驗證。
需要用到的頭文件包含:
#include winsock2.h
#include windows.h
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標準API,一種網絡編程接口,用于兩個或多個應用程序(或進程)之間通過網絡進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平臺支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平臺如Windows CE貌似不支持。通過前綴WSA可以區別于Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬于Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用于編程擴展,使用時必須鏈接mswsock.dll
擴展資料
winsock庫的加載與卸載:
加載:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加載成功,返回值為0。
WORD wVersionRequested:加載的winsock版本,使用宏MAKEWORD(x, y),x表示高字節,y表示低字節。然而使用時MAKEWORD(2, 2)。高字節與低字節相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數后,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起加載,卸載的函數真是輕松愉快。
在windows下用C語言如何實現socket網絡編程,需要用到以下頭文件和庫:頭文件 winsock2.h,靜態庫文件 Ws2_32.lib動態DLL文件 Ws2_32.dll寫一個UDP發送程序的步驟如下:1. 用WSAStartup函數初始化Socket環境;2. 用socket函數創建一個套接字;3. 用setsockopt函數設置套接字的屬性,例如設置為廣播類型;很多時候該步驟可以省略;4. 創建一個sockaddr_in,并指定其IP地址和端口號;5. 用sendto函數向指定地址發送數據,這里的目標地址就是廣播地址;注意這里不需要綁定,即使綁定了,其地址也會被sendto中的參數覆蓋;若使用send函數則會出錯,因為send是面向連接的,而UDP是非連接的,只能使用sendto發送數據;6. 用closesocket函數關閉套接字;7. 用WSACleanup函數關閉Socket環境。與之類似,一個UDP接收程序的步驟如下,注意接收方一定要bind套接字:1. 用WSAStartup函數初始化Socket環境;2. 用socket函數創建一個套接字;3. 用setsockopt函數設置套接字的屬性,例如設置為廣播類型;4. 創建一個sockaddr_in,并指定其IP地址和端口號;5. 用bind函數將套接字與接收的地址綁定起來,然后調用recvfrom函數或者recv接收數據; 注意這里一定要綁定,因為接收報文的套接字必須在網絡上有一個綁定的名稱才能保證正確接收數據;6. 用closesocket函數關閉套接字;7. 用WSACleanup函數關閉Socket環境。參考資料地址:6161217
socket編程寫了一個簡單的DNS服務器。
是這樣實現的,用兩臺PC,一個做客戶端,一個做服務器;
在服務器用socket監視53端口,recvfrom()函數負責接收DNS查詢報文,將其存入事先寫好的數據結構里;
因為DNS查詢報文和應答報文的前部分字段格式都是一樣的,只是修改了幾個參數,然后重點把DNS應答報文后面的字段進行增添。
然后用sendto();函數發送就可以了。
在ie里面輸入任意的網址,回車,就會觸發客戶端向服務器發出DNS查詢報文,
此時你可以同時在服務器和客戶端抓包,看收到的報文是否正確。
注意幾點:
1、一定要熟悉報文結構,定義合適的結構體,將報文進行解析
2、一定要注意網絡序和主機序的轉換htonl(),htons(),ntohl(),ntohs()等
3、找個熟知端口,最好是你熟悉的協議,如ftp,http,dns等。
4、客戶端要把DNS服務器配置為你的服務器ip。