Winsock网络编程笔记:基于UDP的Client
每次写网络程序都必须编写代码载入和释放winsock库,为了以后方便使用,我们将封装一个CInitSock类来管理Winsock库:
// initsock.h文件
#include <winsock2.h>
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if(::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
#include"../common/initsock.h"
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
CInitSock initSock;
int main()
{
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (s == INVALID_SOCKET)
{
cout << "创建socket失败!" << endl;
return 0;
}
sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(5678);
address.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char sendMessage[1024];
while (true)
{
cout << "请输入你要发送的内容:";
cin >> sendMessage;
::sendto(s, sendMessage, strlen(sendMessage), 0, (sockaddr*)&address, sizeof(address));
}
::closesocket(s);
return 0;
}
部分函数详解:
sendto()
SendTo是一个计算机函数,指向一指定目的地发送数据,sendto()适用于发送未建立连接的UDP数据包 (参数为SOCK_DGRAM)。
定义函数
int sendto ( socket s , const void * msg, int len, unsigned int flags, const struct sockaddr * to , int tolen ) ;
s 套接字 ,buff 待发送数据的缓冲区,size 缓冲区长度,Flags 调用方式标志位, 一般为0, 改变Flags,将会改变Sendto发送的形式,addr (可选)指针,指向目的套接字的地址,len addr所指地址的长度。
函数说明
sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结构长度。
返回值
成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。