- 浏览: 13504 次
最新评论
vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板
2009年11月26日
VC和服务器建立TCP连接不像VB的winsock那样两三行代码就能搞定。虽然VC得MFC类库中也有CSocket、CAsyncSocket这样的类,但是这些类的毛病太多,还是返璞归真用socket api来的灵活。
每次用到都得查一遍流程,这次写个几乎通用的模板,以备以后用。
注:
1.因为socket只能传入IP地址,所以要想连接还得先解析域名,以下包括把域名解析为IP的代码。
2.以下代码为阻塞模式(并非异步模式)所以在主线程中使用很可能阻塞程序运行,最好是新开个线程使用。
int retVal;
WORD wVersionRequested;
WSADATA wsaData;
int err;
//构建保存版本号的WORD类型变量
wVersionRequested = MAKEWORD( 1, 1 );
//加载套接字库
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 0;
}
//检查加载的套接字库版本和请求的是否一致
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 0;
}
//定义DWORD类型变量dwIP 该变量保存解析得到的IP地址(32位整数 并非点分十进制字符串)
DWORD dwIP = 0;
//域名解析
HOSTENT* pHS = gethostbyname(strdomain);
if( pHS != NULL)
{
in_addr addr;
CopyMemory(&addr.S_un.S_addr, pHS->h_addr_list[0], pHS->h_length);
dwIP = addr.S_un.S_addr;
}
else
{
WSACleanup();
return 0;
}
//创建套接字,第一个参数是地址族 TCP/IP下始终为AF_INET,第二个参数表示流式套接字,第三个参数指定协议,0表示系统自选协议 而对于流式套接字 系统的自选协议就是TCP协议
SOCKET sckTongJi = socket(AF_INET, SOCK_STREAM, 0);
//定义地址结构体 并初始化
SOCKADDR_IN addrSvr;
addrSvr.sin_family = AF_INET;
addrSvr.sin_addr.S_un.S_addr = dwIP; //inet_addr("127.0.0.1"); //字符串转十六进制IP用inet_addr反之用inet_ntoa
addrSvr.sin_port = htons(80); //使用网络字序 不同处理器高位在前 还是 低位在前不相同 在这儿统一
retVal = connect(sckTongJi, (SOCKADDR*)&addrSvr, sizeof(SOCKADDR_IN));
if (retVal)
{
//AfxMessageBox("connect error!");
WSACleanup();
return 0;
}
char strbuff[4096];
memset(strbuff, 0, sizeof(strbuff));
send(sckTongJi, strout, strout.GetLength(), 0);
recv(sckTongJi, strbuff, 4096, 0);
closesocket(sckTongJi);
WSACleanup();
使用gethostbyname由域名或主机名得IP地址
使用这个东西,首先要包含2个头文件:
#include
#include
struct hostent *gethostbyname(const char *name);
这个函数的传入值是域名或者主机名,例如"www.google.cn","wpc"等等。
传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
};
解释一下这个结构:
其中,
char *h_name 表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
char **h_aliases 表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。
int h_addrtype 表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)
int h_length 表示的是主机ip地址的长度
int **h_addr_lisst 表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。
这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。
发表评论
-
meego开发的学习路线
2012-01-20 12:17 592meego开发的学习路线 201 ... -
如何编写PHP扩展
2012-01-20 12:17 745如何编写PHP扩展 2010年0 ... -
Vim Setting
2012-01-20 12:17 1089Vim Setting 2010年12月05日 ... -
转载 gcc一般用法
2012-01-20 12:17 679转载 gcc一般用法 2011年01月13日 生成特定格 ... -
自己动手编写嵌入式Bootloader之(3)
2012-01-20 12:17 635自己动手编写嵌入式Bootloader之(3) 2011年0 ... -
python
2012-01-19 16:59 1292python 2011年10月10日 dive into ... -
Python,简单的力量
2012-01-19 16:59 917Python,简单的力量 2010年 ... -
实例教程:1小时学会Python
2012-01-19 16:59 724实例教程:1小时学会Pytho ... -
python sys
2012-01-19 16:59 701python sys 2011年05月09日 ... -
乡土菜
2012-01-17 06:44 778乡土菜 2011年12月18日 涓 -
使用NSStream来实现Socket
2012-01-16 05:25 707使用NSStream来实现Socket 2011年03月03 ... -
select函数
2012-01-16 05:25 674select函数 2011年12月31日 原文:http ... -
《ASCE1885的网络编程》---Winsock APIの套接口I/O处理函数
2012-01-16 05:25 1027《ASCE1885的网络编程》---Winsock APIの套 ... -
C# Socket通信三大问题详解
2012-01-16 05:25 1163C# Socket通信三大问题详解 2009年09月20日 ...
相关推荐
基于TCP协议、socket套接字、C语言的简单的字符串收发程序,基于c/s架构。开发环境是VC++6.0。代码简单有注解,亲测保证可以运行。
用VC6开发的一个工具类 可以在窗口上播放视频、播放声音(两者都是基于DirectShow)、播放flash(基于shockwaveflash控件)、串口收发数据(基于mscomm控件)、Socket收发数据(包括TCP UDP协议 服务端客户端)、托盘图标。...
为使连接能平衡使用IO设备,每个连接同时只能投递一个读请求,并通过线程平衡机制保证接收的数据是按顺序的被处理线程处理及通过回调函数传递给应用层;同时也只能投递一个写请求,其余写请求都按顺序放在写队列...
C/C++实现,包括完整源代码,vc工程文件,保证能够编译通过。 使用阻塞方式的socket,使用多线程,有较高的性能. 在局域网中测试达到极限速度. 支持断点续传. 服务端可同时接收多个文件. 传输文件的同时可以发送网络...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
问题3-3:既然现在因特网使用得最多的数据链路层协议并不保证可靠传输,那么为什么我们在数据链路层一章中还要讲授保证可靠传输的停止等待协议呢? 问题3-4:通过普通的电话用户线拨号上网时(使用调制解调器),...
问题5-14:为什么TCP在建立连接时不能每次都选择相同的、固定的初始序号? 问题5-15:能否利用TCP发送端和接收端交换报文段的图来说明慢开始的特点? 问题5-16:对于拥塞避免是否也能够用发送端和接收端交换的报文段...
Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...
-d: 不把记录写到/var/log/wtmp文件里(-n这个参数包含了-d)。 -i: 在重开机之前先把所有与网络相关的装置停止。 install 1.作用 install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户。 ...