开发环境:vc++6.0
windows socket UDP开发函数介绍:
int recvfrom(SOCKET s,char FAR * buf,int len,int flags,struct sockaddr FAR * from,int FAR * fromlen);
说明:
1 SOCKET s:套接字
2 char FAR* buf:接受数据缓冲区
3 int len:接受数据缓冲区大小
4 int flags:该参数影响recvfrom()的行为,有以下取值:
0:无特殊行为
MSG_PEEK:有用的数据被复制到接受缓冲区内,但没有从系统缓冲区中将其删除。
MSG_OOB:表示处理带外数据。
5 struct sockaddr FAR * from:该参数返回发送数据的主机地址
6 int FAR * fromlen:地址长度
7 成功返回接受数据字节数,失败则返回SOCKET_ERROR错误
int sendto(SOCKET s,const char FAR* buf,int len,int flags,const struct sockaddr FAR* to,int tolen);
说明:
1 SOCKET s:套接字
2 const char FAR* buf:发送数据缓冲区
3 int len:接受数据缓冲区大小
4 int flags:该参数影响sendto()的行为,有以下取值:
0:无特殊行为
MSG_DONTROUTE:传输层不要将数据路由出去
MSG_OOB:该数据应该被带外发送
5 const struct sockaddr FAR* to:接受数据主机的地址
6 int tolen:主机地址的大小
其他函数与TCP一致,请见:
http://blog.csdn.net/qq_24282081/article/details/55805436
开发实例:
客户端向服务器发送“MyUDP”,服务器接收到显示在屏幕上
// Server
#include "stdafx.h"
#define BUF_SIZE 64
#include
int main(int argc, char* argv[])
{
WSADATA wsd;
SOCKET s;
SOCKADDR_IN serAddr;
char buf[BUF_SIZE];
SOCKADDR ClientAddr;
//初始化套接字动态库
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == INVALID_SOCKET)
{
printf("socket failed!\n");
WSACleanup();
return 1;
}
//绑定套接字
serAddr.sin_family = AF_INET;
serAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serAddr.sin_port = htons((short)5000);
if(bind(s,(SOCKADDR *)&serAddr,sizeof(serAddr)) == SOCKET_ERROR)
{
printf("bind() failed: %d \n",WSAGetLastError());
closesocket(s);
WSACleanup();
return -1;
}
//接受并显示数据
int nClientLen = sizeof(ClientAddr);
ZeroMemory(buf,BUF_SIZE);
if(recvfrom(s,buf,BUF_SIZE,0,(SOCKADDR *)&ClientAddr,&nClientLen) == SOCKET_ERROR)
{
printf("recvfrom failed: %d \n",WSAGetLastError());
closesocket(s);
WSACleanup();
return -1;
}
printf("%s \n",buf);
cin.get();
return 0;
}
// Client
#include "stdafx.h"
#define BUF_SIZE 64
#include
int main(int argc, char* argv[])
{
WSADATA wsd;
SOCKET s;
SOCKADDR_IN serAddr;
char buf[BUF_SIZE];
//初始化套接字
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
printf("WSAStartup failed! \n");
return -1;
}
//创建套接字
s = socket(AF_INET,SOCK_DGRAM,0);
if(s == INVALID_SOCKET)
{
printf("socket failed : %d \n",WSAGetLastError());
return -1;
}
//发送数据
ZeroMemory(buf,BUF_SIZE);
strcpy(buf,"MyUDP");
serAddr.sin_family = AF_INET;
serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.171");
serAddr.sin_port = htons((short)5000);
int nServAddLen = sizeof(serAddr);
if(sendto(s,buf,BUF_SIZE,0,(SOCKADDR*)&serAddr,nServAddLen) == SOCKET_ERROR)
{
printf("sendto failed: %d \n",WSAGetLastError());
closesocket(s);
WSACleanup();
return 1;
}
printf("%s",buf);
closesocket(s);
WSACleanup();
cin.get();
return 0;
}