recvfrom sendto的解释 多线程编程需要注意的地方 全局变量的设置 自定义消息 大杂烩inet_

本文详细解释了`recvfrom`和`sendto`函数的参数及使用注意事项,强调了在发送端使用`INADDR_ANY`的条件。此外,介绍了线程中全局变量的定义与访问方式,以及如何在多线程环境下,尤其是MFC应用中,通过发送自定义消息实现线程间通信更新界面数据。
摘要由CSDN通过智能技术生成

1 recvfrom sendto的解释

if(-1 != sendto(sockMy, buf, sizeof(buf), 0, (SOCKADDR*)&addrFar, sizeof(SOCKADDR)))

参数依次为:  发送端socket   发送端缓冲区  发送端缓冲区大小  0   接收端地址  sizeof(SOCKADDR)

    返回值 :为整型,如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。


 recvfrom(SockMy, BUF, BUF_SZ, 0, (SOCKADDR*)&AddrFar, &len);

参数意义 依次为   接收端socket  接收端缓冲区 接收端缓冲区大小  0  用来保存数据来源地址  len=sizeof(SOCKADDR)

返回值 :如果正确接收返回接收到的字节数,失败返回-1.


注意 初学者使用sendto的时候容易把接收端的xxx..sin_addr.S_un.S_addr 设置为INADDR_ANY 这是错误的   因为INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。 只能在发送端才可以使用INADDR_ANY(服务端客户端都可能是发送端)  ,否则的话就无法判断我们要发送的地址是哪里。

另外我们常用inet_ntoa(addrTo.sin_addr) 这个函数来判断是否正确的地址 它是与inet_addr相反

2  线程相关

因为线程函数必须是 全局的 或者static的   如果定义为全局的 则我们无法让函数属于某个类 这时候我们只能将类的指针传递给此函数 如下

	//创建接受消息线程
	HANDLE hThread=CreateThread(NULL,0,RecvProc,this,0,NULL);

创建了一个线程     将this指针传递过去  

DWORD WINAPI RecvProc(LPVOID lpParameter)
{
	CChat *This = (CChat *)lpParameter; 
        
	return 0;
} 

如上 我们将可以通过This使用类的成员。   

通常都是定义为static的   


3  全局变量定义的一种方法 

假设工程名为520Chat  则在MFC自动生成的类CMy520ChatApp的头文件中添加 我们需要的全局变量 如int UserId  在构造函数中初始化

当使用全局变量时 添加 CMy520ChatApp *app = (CMy520ChatApp *)AfxGetApp();  这句话   

通过 app-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值