十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这是我的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。