Windows网络编程(基础篇2)
来源:互联网 发布:从元数据 编辑:程序博客网 时间:2024/05/29 11:26
无连接通信UDP
无连接通信是通过UDP/IP协议完成的。UDP不能确保可靠的数据传输,但能将数据发送到过个目标,或者接收多个源数据。
UDP通信不用调用listen和accept。接收函数有recvfrom,和WSARecvFrom。
int recvfrom( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags,//一般填0,具体看MSDN _Out_ struct sockaddr *from,//返回接收端的地址信息 _Inout_opt_ int *fromlen //指向地址结构的长度);
int WSARecvFrom( _In_ SOCKET s, _Inout_ LPWSABUF lpBuffers, _In_ DWORD dwBufferCount, _Out_ LPDWORD lpNumberOfBytesRecvd, _Inout_ LPDWORD lpFlags, _Out_ struct sockaddr *lpFrom, _Inout_ LPINT lpFromlen, _In_ LPWSAOVERLAPPED lpOverlapped, _In_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
- UDP接收端应用程序
#include<winsock2.h>#include<Ws2tcpip.h>#pragma comment(lib,"WS2_32")int main(void){WSADATA wsaData;SOCKET receivingSocket;SOCKADDR_IN ReceiverAddr;int Port = 5150;char ReceiveBuf[1024];int BufLength = 1024;SOCKADDR_IN SenderAddr;int SenderAddrSize = sizeof(SenderAddr);WSAStartup(MAKEWORD(2, 2), &wsaData);//创建一个新的套接字来接收数据报receivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//建立一个SOCKADDR_IN结构,这个结构将告知我们想要使用5150端口来接收来自所有接口的数据报ReceiverAddr.sin_family = AF_INET;ReceiverAddr.sin_port = htons(Port);inet_pton(AF_INET, INADDR_ANY, (void*)&ReceiverAddr.sin_addr.S_un.S_addr);//使用bind将这个地址信息和套接字关联起来bind(receivingSocket, (SOCKADDR*)&SenderAddr, sizeof(SenderAddr));//此时可以在绑定套接字上接收数据报了recvfrom(receivingSocket, ReceiveBuf, BufLength, 0, (SOCKADDR*)&SenderAddr, &SenderAddrSize);//应用程序接收完数据报后。关闭套接字closesocket(receivingSocket);WSACleanup();return 1;}
发送函数有sendto,和WSASendto。
int sendto( _In_ SOCKET s, //socket描述符 _In_ const char *buf, //数据报缓存地址 _In_ int len, //数据报长度 _In_ int flags, //该参数一般为0 _In_ const struct sockaddr *to, //数据发往哪里 _In_ int tolen //对方地址长度);//返回发送的字节数
int WSASendTo( _In_ SOCKET s, _In_ LPWSABUF lpBuffers, _In_ DWORD dwBufferCount, _Out_ LPDWORD lpNumberOfBytesSent, _In_ DWORD dwFlags, _In_ const struct sockaddr *lpTo, _In_ int iToLen, _In_ LPWSAOVERLAPPED lpOverlapped, _In_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
- UDP发送端示例:
WSADATA wsaData;SOCKET SendingSocket;SOCKADDR_IN ReceiverAddr;int Port = 5150;char SendBuf[1024];int BufLength = 1024;WSAStartup(MAKEWORD(2, 2), &wsaData);SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);ReceiverAddr.sin_family = AF_INET;ReceiverAddr.sin_port = htons(Port);inet_pton(AF_INET, "136.149.3.29", (void*)&ReceiverAddr);sendto(SendingSocket, SendBuf, BufLength, 0, (SOCKADDR*)&ReceiverAddr, sizeof(ReceiverAddr));closesocket(SendingSocket);WSACleanup();
常用winsock API。
- 获取通信方的套接字地址信息,该信息是关于已建立连接的套接字。
int getpeername( _In_ SOCKET s, //准备连接的套接字 _Out_ struct sockaddr *name, _Inout_ int *namelen);
- 获取给定套接字本地接口信息。
int getsockname( _In_ SOCKET s, _Out_ struct sockaddr *name, _Inout_ int *namelen);
声明:以上整理于Windows网络编程(第二版)
1 0
- Windows网络编程(基础篇2)
- Windows网络编程(基础篇1)
- Windows网络编程基础
- Windows网络编程基础
- Windows网络编程基础学习
- Windows Socket 网络编程基础
- Windows网络编程之WinSock编程基础
- 网络编程基础篇
- 网络编程--基础篇
- Windows的网络编程-之一-WinSock基础
- Windows的网络编程-之一-WinSock基础
- 网络编程基础(2)
- Linux网络编程--(2)网络编程基础
- 网络编程(基础)
- 《Windows网络编程 2》读书笔记(一)
- 网络编程之网络协议概念(基础篇)
- Windows 网络编程(8).2
- windows网络编程(一)
- Java从入门到精通阅读笔记(第4版)12
- 螺旋方针(螺旋矩阵)
- 设置Dialog的显示宽度
- 《win32多线程程序设计》学习笔记四
- 关于verilog中if与case语句不完整产生锁存器的问题
- Windows网络编程(基础篇2)
- 转载
- MySQL分区表
- C#读取与写入配置文件
- ArrayList总结
- vue基础
- 避免创建不必要的对象
- hdu4347 kd-tree询问k近点
- Android Studio升到2.3 关于gradle的问题