UDP封装基础学习记录

size_t  是一种整形类型,里面保存的是一个整数,如同int , long 一样。他是一种记录大小的数据类型,它可以同sizeof等同起来,以此类推,size_t也就可以做int 相类似的运算。那么为什么不直接用int来代替它呢?它是为了提高代码的可移植性。比如,在32位的操作系统中它是4字节,但是在64位的操作系统中它是8字节。

recvfrom 它是一个经socket接收数据的函数,如果接收失败返回-1.类似的还有sendto。它的参数有:

int sockfd : 标识一个已连接套接口的描述字

void *buf : 接收数据的缓冲区

int len : 接收数据的缓冲区的长度

unsigned int flags : 一般为0

struct sockaddr *from : 接收的地址

socket_t *fromlen : 接收地址的长度

bind() 是一个把本地的地址和套接口绑定的函数,它的参数有:

SOCKET s : 标识一个未绑定的套接口的描述字

const struct sockaddr FAR* name: 赋予套接口地址

int namelen: 赋予的套接口地址的长度

SOCKADDR_IN 是一个结构体,它在netinet/in.h中的定义如下:

struct sockaddr_in{

short sin_family;     //协议家族,在socket编程中只能是AF_INET

unsigned short sin_port;    //储存端口号,普通数字可以用htons()函数转化成网络数据格式的数字

struct in_addr sin_addr;   //储存ip地址,使用in_addr这个数据结构

unsigned char sin_zero[8];

}

memset((char*)&mysock, 0, sizeof(mysock))是对它的初始化。

s_addr 按照网络字节顺序储存ip地址。

WSAStartup ,为了在应用程序中调用任何一个Winsock API 函数,首先第一件事就是必须通过它来对Winsock服务初始化。

下面看视频写的,其中有点点的变化,可能会有错误

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
#include<WinSock2.h>
#include<string>
using namespace std;


int socket_send(const char*IP) {
DWORD ver;
WSADATA wsadata;
ver = MAKEWORD(1, 1);
WSAStartup(ver, &wsadata);
SOCKET st = socket(AF_INET,SOCK_DGRAM,0);   //制定用哪一个协议
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;       //使用TCP/IP地址
addr.sin_port = htons(9999);         //转化成网络可以识别的
addr.sin_addr.s_addr = inet_addr(IP);        //发给自己测试
char buf[1024] = { 0 };
size_t recv = 0;
while (1) {
memset(buf, 0, sizeof(buf));   //每次输入清空之前的缓存
cin >> buf;
if (buf[0] == '0')
break;
int len = sizeof(buf);
recv = sendto(st, buf, len, 0, (struct sockaddr *)&addr, sizeof(addr));
}
closesocket(st);
WSACleanup();
return recv;
}


int sock_revieve( ) {
DWORD ver;
WSADATA wsadata;
ver = MAKEWORD(1, 1);
WSAStartup(ver, &wsadata);
SOCKET st = socket(AF_INET, SOCK_DGRAM, 0);  
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;                  
addr.sin_port = htons(9999);            
addr.sin_addr.s_addr = htonl(INADDR_ANY);
size_t rc;
if (bind(st, (struct sockaddr *)&addr, sizeof(addr)) > -1) {        //捆绑成功
char buf[1024] = { 0 };
struct sockaddr_in sendaddr;
memset(&sendaddr, 0, sizeof(sendaddr));
int len = sizeof(sendaddr);
memset(buf, 0, sizeof(buf));
//cout << sendaddr.sin_addr.s_addr << endl;
while (sendaddr.sin_addr.s_addr != inet_addr("10.111.26.222")) {
memset(buf, 0, sizeof(buf));       //每次清空缓存区
rc = recvfrom(st, buf, sizeof(buf), 0, (struct sockaddr *)&sendaddr, &len);
cout <<inet_ntoa(sendaddr.sin_addr)<<":"<< buf << endl;
}
//cout << sendaddr.sin_addr.s_addr << endl;
}
closesocket(st);
WSACleanup();
return 0;
}
int main(int a,char* b[]) {
if (a > 1) 
socket_send(b[1]);
else
sock_revieve();
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值