`
strong_fee
  • 浏览: 176047 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Socket(二)

阅读更多

2)提出连接申请
  在成功调用了socket函数后,对客户端来说就是与服务器端建立连接。同样,建立连接需要两个函数:connectWSAConnect。前者是标准的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的数据转换为网络字节顺序的数据。而ntohsntohl的功能则是刚好相反。另外,sockaddr_in结构的sin_addr.s_addr成员要求是用来描述对方地址的一个值,即网际地址值,而实际应用中,我们得到的大多是IP地址或域名,如202.210.205.1www.cfan.cn.net,可以用inet_addr函数将点分法表示的IP地址转换为所要求的值,可以用gethostbynameWSAAsynGetHostbyName取回用易用名表示的主机的信息。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类型的连接,故发送可以采用的函数有sendWSASend,而接收可以采用recvWSARecv,同样,全小写的函数是标准的Socket函数,WSA开头的是微软的扩展函数. Sendrecv调用成功返回所发送或接收的字节数,如果调用失败则返回SOCKET_ERROR!
int PASCAL FAR WSASend ( SOCKET s, const char FAR *buf,int len, int flags );
参数:

s发送操作所用的套接字描述符
buf
发送的数据缓冲区的地址,为char*类型,至于其它类型的数据可以用强制类型转换(char*)。在接收端再用强制类型转换回来!
len buf
所发送的缓冲区的大小,也就是所要发送的字节数!
flags
一个附加标志,可以为0MSG_OOBMSG_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(ZeroMemorymemset),不过还是建议加上这一句。

分享到:
评论

相关推荐

    包的测试 SOCKET传二进制流

    测试包 包的测试 SOCKET传二进制流 C

    socket实现HTTP代理服务器

    下面是一个先前我用socket实现HTTP代理服务器的例子,代码很简单我就不一一解析了,要注意的是:当该代理服务器收到IE发来的请求时,要将IE请求行中的webserver的域名(或者IP)剥去,再将请求转发给webserver,如果...

    Go-veryveryvery轻量级的socket封装不粘包心跳检测并发安全

    very very very轻量级的socket封装, 不粘包, 心跳检测, 并发安全

    C# Socket通信 TCP通信 UDP通信通讯源码收发二进制和文本数据

    C# Socket通信的源码,支持TCP和UDP收发二进制数据,如图片,视频,音频数据,或者是文本数据。也支持UDP收发数据。简单友好的API,可以直接拿来用。基于.NET Framework2.0的,只要高于2.0版本的Framework都可以正常...

    Socket工具SocketTool

    Socket工具SocketTool,可以对端口进行监听,同时支持TCP和UDP,包含Socket的二次开发手册

    java socket 二

    NULL 博文链接:https://antjava.iteye.com/blog/679695

    基于HP_Socket框架的socket通讯源码

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E...方便二次开发。省去研究框架的时间

    实验二Socket编程与注册表编程.pdf

    实验二Socket编程与注册表编程.pdf

    远程调用技术代码追踪(socket) 之二

    远程调用技术代码追踪(socket).doc 之二

    C#收发二进制数据比如图片,声音、文件、视频等基于流的tcp协议socket服务端和客户端

    C#开发的Socket通信源码。包含客户端和服务端。基于windows系统的IOCP模型开发,吞吐性能高,稳定性强。也非常容易和第三方系统进行对接。基于SharpSocket开发。使用TCP协议,可以自动重连。

    HP-Socket 3.0.2

    方法二: ----------------------------------------------------------------------- (0) 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件 (1) 创建 CXxxWrapper 包装器,通过包装器智能指针使用 HP...

    基于socket的网络编程

    二、实验内容 本实验通过一个简单的网络应用来实现客户端与服务器端的通信.客户端给服务器端发送一行字符串,服务器接收字符串,同时可以发回复给客户端,在客户端显示出来。 在Socket通信中,发送方和接收方的两个...

    socket通信与串口通信(二选择一)

    什么是socket通信? TCP/IP协议是传输层协议,主要解决数据如何在网络中传输。HTTP是应用层协议,主要解决如何包装数据。 Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的...

    目前.NET最强SOCKET框架组“北风之神”(ZYSOCKET) 3.0 源代码

    朋友你还找用WCF,分布式?传统的SOCKET? 我告诉你 你OUT了 因为现在开始你要使用 “北风之神”了 ...第二个例子看完 登堂入室了 2个例子代码量 小与100行(排除除了WINFROM 生存的代码) 赶快下载吧还犹豫什么呢?

    多播 Multicast Socket示例

    关闭socket <br>如果你仅仅是想向一个组播组发送数据,而不要接受数据,那么可不用加入组播组,而直接通过sendto向组播组发送数据 <br> 五.winsock 2组播 winsock 2组播主要是通过WSAJoinLeaf来实现的...

    C++解析json/socket通讯

    使用C++解析json客户端发送的json数据,使用socket通讯的案例

    HP-Socket v3.1.1 正式版

    方法二: ------------------------------------------------------------------------------ (1) 应用程序把需要用到的导出函数封装到特定语言的包装类中 (2) 通过包装类封装后,以面向对象的方式使用 HPSocket 4....

    Unity3D Socket通信使用Protobuf数据格式

    4.以二进制方式发送网络消息。 5.以ProtuBuf方式发送网络消息。 Server.cs 功能: 1.收到的数据不做修改即可发送 目录说明: 1.Scripts/Socket/Protobuf:Protobuf源码 2.Scripts/Socket/ProtocalData: 存放*....

    C# Winform 即时通信实例(基于Socket )

    本代码分别提供了基于Socket 做的即时通信实例的客户端和服务器端。代码结构清晰,注释明了。适合Socket入门学习,调试使用,以及Demo的二次开发。

    C# Socket传输主机硬件配置信息

    二、Client ---客户端,引用xxbtool,暂时功能只有:与服务端消息通信、传送主机配置Model给服务端。 客户端注意:Client\bin\Debug下有MonitorInfoView.exe、MonitorInfoView.dll、MonitorInfoView.cfg三个外部文件...

Global site tag (gtag.js) - Google Analytics