2)提出连接申请
在成功调用了socket函数后,对客户端来说就是与服务器端建立连接。同样,建立连接需要两个函数:connect和WSAConnect。前者是标准的Socket函数,后者是微软的扩展函数。
int PASCAL FAR WSAConnect ( SOCKET s, const struct sockaddr FAR *name, int namelen );
参 数:
s:所使用的套接字描述符;
name:一个sockaddr结构,sockaddr结构是一个通用的结构,它只是简单地定义了一个字节数组,在TCP/IP下一般将其解释为sockaddr_in结构,第3个参数则是该结构的长度,一般用sizeof函数来取得;
namelen:name的长度
示例代码:
sockaddr_in sock;
sock.sin_family=AF_INET;
sock.sin_port=htons(80);
sock.sin_addr.s_addr=inet_addr(“202.205.210.1”);
if(connect(sk,(sockaddr*)&sock,sizeof(sock)==SOCKET_ERROR)
{
//错误处理
}
sockaddr_in结构体
struct sockaddr_in {
//地址族(指定地址格式) ,设为AF_INET
short sa_family;
u_short sin_port; //端口号
struct in_addr sin_addr; //IP地址
char sin_zero[8]; //空子节,设为空
}
sockaddr结构体
struct sockaddr{
u_short sa_family;
char sa_data[14];
}
这里有一点要说明的是,用于填写sockaddr_in结构的值必须是以网络字节顺序表示的值,而不能直接使用本机字节顺序的值。之所以这样规定是因为在网络上存在不同的系统,不同的系统中数据存储时所采用的字节排列顺序是不同的,有的是高字在前,低字在后,而有的刚好相反。为了统一,规定了一个所谓的网络字节顺序。htonl函数可以将本地的unsigned long数据转换为网络字节顺序的数据。htons则是将unsigned short的数据转换为网络字节顺序的数据。而ntohs、ntohl的功能则是刚好相反。另外,sockaddr_in结构的sin_addr.s_addr成员要求是用来描述对方地址的一个值,即网际地址值,而实际应用中,我们得到的大多是IP地址或域名,如202.210.205.1或www.cfan.cn.net,可以用inet_addr函数将点分法表示的IP地址转换为所要求的值,可以用gethostbyname、WSAAsynGetHostbyName取回用易用名表示的主机的信息。gethostbyname函数调用成功会返回一个hostent结构的指针,若错误则返回NULL。下面介绍一下gethostbyname函数的用法。
hostent *host;
.......
host=gethostbyname(“www.cfan.cn.net”)
if(host==NULL)
{
//错误处理
sock.sin_addr.s_addr=*((unsigned long*)host→h_addr_list[0]);
......
三、数据的传送和接收
于这里建立的是SOCK_STREAM类型的连接,故发送可以采用的函数有send和WSASend,而接收可以采用recv和WSARecv,同样,全小写的函数是标准的Socket函数,以WSA开头的是微软的扩展函数. Send、recv调用成功返回所发送或接收的字节数,如果调用失败则返回SOCKET_ERROR!
int PASCAL FAR WSASend ( SOCKET s, const char FAR *buf,int len, int flags );
参数:
s:发送操作所用的套接字描述符
buf:发送的数据缓冲区的地址,为char*类型,至于其它类型的数据可以用强制类型转换(char*)。在接收端再用强制类型转换回来!
len buf:所发送的缓冲区的大小,也就是所要发送的字节数!
flags:一个附加标志,可以为0、MSG_OOB、MSG_DONTROUTE. 如果对所发送的数据没特殊要求,直接设为0。
对于Datagram Socket而言,若是 datagram 的大小超过限制,则将不会送出任何资料,并会传回错误值。对Stream Socket 言,Blocking 模式下,若是传送系统内的储存空间不够存放这些要传送的资料,send()将会被block住,直到资料送完为止;如果该Socket被设定为 Non-Blocking 模式,那么将视目前的output buffer空间有多少,就送出多少资料,并不会被 block 住。flags 的值可设为 0 或 MSG_DONTROUTE及 MSG_OOB 的组合。
int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags );
参数说明同发送。
示例代码(send函数):
SOCKET sk;
char szTest[]=“This is an example!”
int iRet;
......(这里省略创建套接字,连接...)
iRet=send(sk,szTest,strlen(szTest),0);
if(iRet==SOCKET_ERROR)
{
//错误处理
}
else if(iRet!=strlen(szTest))
MessageBox(NULL,“未发送所有的数据”,“警告”,MB_OK);
示例代码(recv函数)
SOCKET sk;
char szTest[20]
int iRet;
......(这里省略创建套接字,连接......)
iRet=recv(sk,szTest,20,0);
if(iRet==SOCKET_ERROR)
{
//错误处理
}
szTest[iRet]=`\0`;//这一行代码不可少!因为recv函数不会自动将数据缓冲末尾设为表示数据结束的空中止符(`\0`),因此,一不留神就会出现缓冲区越界。当然也可以在调用recv函数前先将缓冲区清0(用ZeroMemory或memset),不过还是建议加上这一句。
分享到:
相关推荐
测试包 包的测试 SOCKET传二进制流 C
下面是一个先前我用socket实现HTTP代理服务器的例子,代码很简单我就不一一解析了,要注意的是:当该代理服务器收到IE发来的请求时,要将IE请求行中的webserver的域名(或者IP)剥去,再将请求转发给webserver,如果...
very very very轻量级的socket封装, 不粘包, 心跳检测, 并发安全
C# Socket通信的源码,支持TCP和UDP收发二进制数据,如图片,视频,音频数据,或者是文本数据。也支持UDP收发数据。简单友好的API,可以直接拿来用。基于.NET Framework2.0的,只要高于2.0版本的Framework都可以正常...
Socket工具SocketTool,可以对端口进行监听,同时支持TCP和UDP,包含Socket的二次开发手册
NULL 博文链接:https://antjava.iteye.com/blog/679695
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E...方便二次开发。省去研究框架的时间
实验二Socket编程与注册表编程.pdf
远程调用技术代码追踪(socket).doc 之二
C#开发的Socket通信源码。包含客户端和服务端。基于windows系统的IOCP模型开发,吞吐性能高,稳定性强。也非常容易和第三方系统进行对接。基于SharpSocket开发。使用TCP协议,可以自动重连。
方法二: ----------------------------------------------------------------------- (0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 (1) 创建 CXxxWrapper 包装器,通过包装器智能指针使用 HP...
二、实验内容 本实验通过一个简单的网络应用来实现客户端与服务器端的通信.客户端给服务器端发送一行字符串,服务器接收字符串,同时可以发回复给客户端,在客户端显示出来。 在Socket通信中,发送方和接收方的两个...
什么是socket通信? TCP/IP协议是传输层协议,主要解决数据如何在网络中传输。HTTP是应用层协议,主要解决如何包装数据。 Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的...
朋友你还找用WCF,分布式?传统的SOCKET? 我告诉你 你OUT了 因为现在开始你要使用 “北风之神”了 ...第二个例子看完 登堂入室了 2个例子代码量 小与100行(排除除了WINFROM 生存的代码) 赶快下载吧还犹豫什么呢?
关闭socket <br>如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据 <br> 五.winsock 2组播 winsock 2组播主要是通过WSAJoinLeaf来实现的...
使用C++解析json客户端发送的json数据,使用socket通讯的案例
方法二: ------------------------------------------------------------------------------ (1) 应用程序把需要用到的导出函数封装到特定语言的包装类中 (2) 通过包装类封装后,以面向对象的方式使用 HPSocket 4....
4.以二进制方式发送网络消息。 5.以ProtuBuf方式发送网络消息。 Server.cs 功能: 1.收到的数据不做修改即可发送 目录说明: 1.Scripts/Socket/Protobuf:Protobuf源码 2.Scripts/Socket/ProtocalData: 存放*....
本代码分别提供了基于Socket 做的即时通信实例的客户端和服务器端。代码结构清晰,注释明了。适合Socket入门学习,调试使用,以及Demo的二次开发。
二、Client ---客户端,引用xxbtool,暂时功能只有:与服务端消息通信、传送主机配置Model给服务端。 客户端注意:Client\bin\Debug下有MonitorInfoView.exe、MonitorInfoView.dll、MonitorInfoView.cfg三个外部文件...