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 ) ;

套接字  ,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 中。

原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451011.html