基于UDP的Winsock编程与基于TCP的Winsock编程相比,只是缺少了一个步骤而已。对于Server,缺少了接受连接的过程(accept()函数调用);对于Client,缺少了请求连接的过程(connect()函数调用)。
另外与TCP区别的还有,在UDP中,数据收发函数是:sendto(),和recvfrom()函数。
函数原型为:
int sendto(SOCKET s,const char FAR *buf,int len,int flags,const struct sockaddr FAR *to,int tolen);
int recvfrom(SOCKET s,char FAR *buf,int len,int flags,struct sockaddr FAR *to,int FAR *fromlen);
参数flags一般设置为0;
参数to为目标地址结构信息;
参数tolen为目标地址结构大小;
废话少说,上代码!
代码:
Server
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"WS2_32.lib")
int main(){
WSADATA data;
WORD w=MAKEWORD(2,0);
::WSAStartup(w,&data);
char sztext[]="欢迎你\r\n";
SOCKET s;
s=::socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in addr,addr2;
int n=sizeof(addr2);
char buff[11]={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr*)&addr,sizeof(addr));
printf("UDP服务器已启动\r\n");
while(true){
if(::recvfrom(s,buff,10,0,(sockaddr*)&addr2,&n)!=0){
printf("%s已经连接上\r\n",inet_ntoa(addr2.sin_addr));
printf("%s\r\n",buff);
::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr2,n);
break;
}
}
::closesocket(s);
::WSACleanup();
if(getchar()){
return 0;
}else{
::Sleep(100);
}
}
Client
#include <winsock2.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"WS2_32.lib")
int main(){
WSADATA data;
WORD w=MAKEWORD(2,0);
::WSAStartup(w,&data);
char sztext[]="服务器你好!\r\n";
SOCKET s;
s=::socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in addr,addr2;
int n=sizeof(addr2);
char buff[10]={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
printf("UDP客户端已经启动\r\n");
if(::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr,n)!=0){
::recvfrom(s,buff,10,0,(sockaddr*)&addr2,&n);
printf("服务器说:%s\r\n",buff);
::closesocket(s);
::WSACleanup();
}
if(getchar()){
return 0;
}else{
::Sleep(100);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)