首页 > 系统相关 >windows c++ socket

windows c++ socket

时间:2023-12-15 15:45:18浏览次数:28  
标签:std socket windows c++ wstring char int intSO string

socket

用winsocket时,send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:
int nNetTimeout = 1000; //1秒
//发送时限
setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );
//接收时限
setsockopt( socket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );

 

 

int recvTimeout = 30 * 1000; //30s
int sendTimeout = 30 * 1000; //30s

setsockopt(sClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&recvTimeout ,sizeof(int));
setsockopt(sClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&sendTimeout ,sizeof(int));

 

 

sClient:将要被设置的 套接字。

 

点击打开原文链接

int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);

函数返回说明:

成功执行时,返回0。失败返回-1,errno被设为以下的某个值  
EBADF:sock不是有效的文件描述词
EFAULT:optval指向的内存并非有效的进程空间
EINVAL:在调用setsockopt()时,optlen无效
ENOPROTOOPT:指定的协议层不能识别选项
ENOTSOCK:sock描述的不是套接字

 

参数:  
sock:将要被设置或者获取选项的套接字。
level:选项所在的协议层。
optname:需要访问的选项名。
optval:指向包含新选项值的缓冲。

optlen:长度。

 

参数详细说明:

level 指定控制套接字的层次可以取三种值:
1) SOL_SOCKET:  通用套接字选项。
2) IPPROTO_IP:  IP选项。

3) IPPROTO_TCP:  TCP选项

optname:

选项名称        说明                  数据类型
========================================================================
            SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允许发送广播数据            int
SO_DEBUG        允许调试                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        获得套接字错误             int
SO_KEEPALIVE      保持连接                int
SO_LINGER        延迟关闭连接              struct linger
SO_OOBINLINE      带外数据放入正常数据流         int
SO_RCVBUF        接收缓冲区大小             int
SO_SNDBUF        发送缓冲区大小             int
SO_RCVLOWAT       接收缓冲区下限             int
SO_SNDLOWAT       发送缓冲区下限             int
SO_RCVTIMEO       接收超时                struct timeval
SO_SNDTIMEO       发送超时                struct timeval
SO_REUSERADDR      允许重用本地地址和端口         int
SO_TYPE         获得套接字类型             int
SO_BSDCOMPAT      与BSD系统兼容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在数据包中包含IP首部          int
IP_OPTINOS       IP首部选项               int
IP_TOS         服务类型
IP_TTL         生存时间                int
========================================================================
            IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大数据段的大小           int
TCP_NODELAY       不使用Nagle算法             int
========================================================================

 

在windows C++的环境下,会接触到好多种字符串类型:

C++的std::string, std::wstring, char*, wchar*, windows的LPCTSTR,MFC的CString.....

先来说说C++入门时最早接触的: std::string类和char*

string是一个类,用起来非常方便,char*转成std::string的几种方法:

char szName[100] = "abcde\0123";
string str1 = szName; //str1是abcde
string str2(szName); //str2是abcde
string str3(szName, 9); //str3是abcde\0123, 该构造函数常用于保存二进制数据
这里要注意一点对比,就是:

string (const char* s);
该构造函数的意思是:Copies the null-terminated character sequence (C-string) pointed by s.

string (const char* s, size_t n);
而这个构造函数的意思是:Copies the first n characters from the array of characters pointed by s. 可以用于二进制数据的拷贝。

这2个东西其实很类似的,重要的是: 编码格式一致:ANSI, 也就是用的ASCII编码。

char* 可以方便地生成string, string也可以方便地转化成char*:

std::string str = "abc";
char* szName = str.c_str();
更多资料,可以查看C++ reference:

http://www.cplusplus.com/reference/string/string/

而wstring就是string的变种,使用的是Unicode编码,2个字节,所以wchar占用2个字节。

wstring与wchar*的关系 和 string和char*的关系是一样的。wstring就可以用来表示中文字符。

wstring类拥有的成员函数, wchar*的函数 和 string以及char*几乎都是一样的。

那么就有一个问题,string和wstring如何互相转化呢。

#define CP_ACP 0 // default to ANSI code page
就需要用到Windows API函数MultiByteToWideChar,一般需要使用2次:

void ConvertAnsiTounicode(char * source,TCHAR * dst)
{
int nLength = 0;
nLength = MultiByteToWideChar(CP_ACP,0,source,-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,source,-1,dst,nLength);
}

函数MultiByteToWideChar使用不当,会影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区。

 

那么wstring也可以转化到string, 就是一个反过来的API:WideCharToMultiByte, 用法也类似。

那么LPCTSTR呢,分2种情况: LPCSTR和LPCWSTR,其实只是微软的宏定义,说白了就是const char*和const wchar*,不要被吓坏了!!!!所以直接当成const char*和const wchar*使用就行了。

剩下一个就是MFC的CString, 它也分2种: CStringA和CStringW

首先,CString可以直接强转成LPCTSTR。也就是说(以下代码为Unicode版本),

CString Cstr = L"lalala";
const wchar_t* = (LPCTSTR)Cstr;
可以这样玩。

也就是CString和wchar_t*可以直接转换啦。那么std::wstring和CStringW也能互相转换:

CString转成std::wstring, 一行代码搞定,有wchar_t*这个中介:

std::wstring str = (LPCTSTR)(Cstr);
std::wstring转成CString:

CString Cstr(wstr.c_str());
即可。那么CStringA和std::string也可以通过中介char*来互相转换成功的
————————————————
版权声明:本文为CSDN博主「清楼小刘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33826977/article/details/79306496

 

 

 

参考:

https://blog.csdn.net/qq_33826977/article/details/79306496

https://www.cnblogs.com/zhangmo/p/3768604.html

https://blog.csdn.net/mpp_king/article/details/80248496

https://blog.csdn.net/qq_33826977/article/details/79306496

 

标签:std,socket,windows,c++,wstring,char,int,intSO,string
From: https://www.cnblogs.com/rebrobot/p/17903491.html

相关文章

  • Flask + SocketIO实现简易实时在线聊天室
    下面是一个简单的示例,演示了使用Python(使用Flask框架)作为服务端,以及HTML、JavaScript和Socket.io作为前端,实现一个简单的实时聊天室。首先,确保你已经安装了Flask和Flask-SocketIO:pipinstallFlaskFlask-SocketIO然后,创建一个名为app.py的Python文件:fromflas......
  • C++基础 -7- 引用
    ———————引用———————引用就是数据本身不占用空间 ......
  • Windows 10 LTSC 2021 占用内存过高的解决
    1.注册表导入文件,并运行WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\AppXSvc]"Start"=dword:00000004[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\ClipSVC]"Start"=dword:00000004 2......
  • Windows + MinGW-W64 Boost程序库 环境配置踩坑指南
    Windows+MinGW-W64Boost程序库环境配置踩坑指南本文仅在博客园由aquawius发布,请在转载注明本链接,我这里就不写开源协议了,总之盗文章的马没了就完了。0x00关于MinGW-W64的安装你可以自己选择,我使用的来自github的w64devkit,这个工具内置了比较多的小工具,在linux中有许......
  • Windows + MinGW-W64 Boost程序库 环境配置踩坑指南
    Windows+MinGW-W64Boost程序库环境配置踩坑指南0x00关于MinGW-W64的安装你可以自己选择,我使用的来自github的w64devkit,这个工具内置了比较多的小工具,在linux中有许多工具windows用不了,w64devkit里边就有提供(甚至包括vim!!)添加bin目录到环境变量就可以了.0x01关于Bo......
  • windows提权
    WindowsPrivilegeEscalation提权前先基本信息收集:系统版本、漏洞补丁、杀软防护、当前权限、系统配置、系统的服务等查看系统进程:tasklist/svc(杀软防护软件检查)系统漏洞提权思路:查看系统补丁信息,若有系统内核漏洞,但没打补丁就可以尝试找exp查找补丁情况#看windows版本v......
  • windows信息收集
    windows基础知识注册表编辑器win+r输入regedit命令hostnamewhoamiipconfig,iconfig/?表示查看帮助手册cls:清除netstat:查看tcp/ip连接net:用于管理网路资源icacls:用于管理权限标识M:修改W:写R:读X:列出文件夹内容F:完全控制RX:读取和执行WX:更改和执行打开控制面板的......
  • windows安全基本概念
    基本概念账户安全账号信息存储(SAM)SAM:securityaccountmanagerSAM对账户的管理是通过安全标识进行的,每个账户的安全标识是唯一的,账户被创建时,安全标识就会产生。SAM文件是windows的一个账户数据库,存储了登录名、密码等信息。该文件是加密存储的,只有system权限可以访问路径:1......
  • 用C++调用Windows.Media.Ocr接口实现图片的OCR识别
    这个接口最开始是给UWP程序用的。C++里需要用C++/WinRT方式调用。默认参数的识别率也不是很高的样子。只支持Win10+。#include<winrt/Windows.Storage.h>#include<winrt/Windows.Storage.Streams.h>#include<winrt/Windows.Graphics.Imaging.h>#include<winrt/Windows.Me......
  • C++(this指针)
    在C++中,this是一个关键字,表示指向当前对象的指针。它是每个非静态成员函数的一个隐式参数,被用于指向调用该函数的对象。通过this指针,成员函数可以访问调用它的对象的成员变量和成员函数。以下是一个简单的示例,演示了this指针的使用:#include<iostream>classMyClass{......