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),不过还是建议加上这一句。
分享到:
相关推荐
在标题"java socket 二"中,我们可能是在讨论进阶的Socket编程技术,比如多线程处理客户端连接,或者更复杂的网络协议实现。通常,一旦服务器接受一个连接,就会为每个客户端创建一个新的线程来处理通信,以避免阻塞...
#### 二、Socket 编程基础 在实现 HTTP 代理服务器的过程中,Socket 编程是核心部分。Socket 是网络通信的一种方式,通过 Socket 可以在不同的主机间建立连接,进行数据交换。 1. **创建 Socket**:通过 `socket` ...
本文将深入探讨“包的测试”以及如何通过SOCKET在C语言环境中传递二进制流。 首先,TCP是一种面向连接的、可靠的传输层协议,它确保了数据在互联网上的正确、完整传输。TCP通过建立连接来保证数据的有序和无损传输...
2. **数据传输**:该工具提供发送和接收数据的功能,可以方便地进行文本或二进制数据的传输。这对于调试网络应用、测试协议兼容性或者进行快速的数据交换非常有用。 3. **协议支持**:SocketTool通常支持TCP(传输...
**二、SuperSocket的基本架构** 1. **SocketBase**:这是SuperSocket的核心组件,它封装了Socket操作,提供基本的网络通信功能,如接收和发送数据,处理连接请求等。 2. **SocketService**:这是一个抽象基类,它...
在Go语言中,网络编程是构建分布式系统和网络服务的基础,而socket是网络通信的核心组件。"Go-veryveryvery轻量级的socket封装不粘包心跳检测并发安全"这个项目,显然旨在提供一个高效、易用且适用于并发环境的...
这款工具的强大之处在于它不仅提供了基础的端口监听功能,还支持Socket的二次开发,为程序员和网络管理员提供了更广阔的定制空间。 在TCP协议中,SocketTool能够帮助用户建立可靠的、面向连接的通信链路。TCP协议...
2. **数据发送与接收**:在连接成功后,工具可以发送各种类型的数据(如文本、二进制数据)到服务器,并接收服务器返回的数据,检查数据传输的正确性。 3. **性能测试**:测试工具可以评估Socket通信的性能,包括...
发送消息通常涉及将数据包装成特定格式(如JSON或二进制)然后发送,接收消息则需解析接收到的数据并处理。HPSocket提供了异步和同步两种方式,满足不同场景的需求。 5. **上线和下线提醒**: 当客户端成功连接到...
**二、Socket类型** Socket 主要有两种类型:流式Socket(Stream Socket,使用TCP协议)和数据报Socket(Datagram Socket,使用UDP协议)。流式Socket保证数据的有序无损传输,而数据报Socket则不保证数据的顺序和...
C# Socket通信的源码,支持TCP和UDP收发二进制数据,如图片,视频,音频数据,或者是文本数据。也支持UDP收发数据。简单友好的API,可以直接拿来用。基于.NET Framework2.0的,只要高于2.0版本的Framework都可以正常...
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E...方便二次开发。省去研究框架的时间
二、服务端程序开发 1. 基本结构:在SuperSocket中,服务端的核心是Server类,它负责监听客户端的连接请求。开发者需要继承Server类并实现其接口,定义自己的处理逻辑。 2. 会话管理:SuperSocket中的Session对象...
4. **文件传输**:在数据连接上,客户端和服务器之间会进行二进制数据的交换,直到文件传输完毕。 5. **关闭连接**:传输完成后,客户端会关闭数据连接,并可能发送"QUIT"命令结束控制连接。 项目中的“exp5”可能...
#### 二、常见错误代码详解 ##### 1. **Socket error #11001 - Host not found** - **含义**:此错误表明计算机无法找到目标主机(服务器)的IP地址,通常是DNS解析失败导致的。 - **解决办法**: - 检查DNS设置...
**二、服务端** 服务端通常需要执行以下步骤: 1. 创建一个ServerSocket,监听特定的端口。 2. 接受客户端的连接请求,生成一个新的Socket。 3. 获取新Socket的输入/输出流,准备进行数据的读写。 4. 从InputStream...
二、Socket服务器 Socket服务器是等待客户端连接并处理请求的程序。其工作流程大致如下: 1. 创建Socket:服务器首先创建一个ServerSocket对象,指定监听的端口号。 2. 监听连接:调用ServerSocket的accept()方法,...
#### 二、Internet Socket的价值 在Internet环境中,Socket具有非常重要的地位。主要有两种类型的Socket:流式Socket(Stream Sockets)和数据报Socket(Datagram Sockets)。这两种Socket分别对应于TCP(传输控制...
二、C#中的Socket类 在C#中,System.Net命名空间下的Socket类是进行Socket编程的主要工具。Socket支持两种主要的网络协议:TCP(传输控制协议)和UDP(用户数据报协议),分别对应StreamSocket和DatagramSocket。 ...
二、TCP Socket编程 1. 创建Socket:在客户端,使用`socket()`函数创建一个Socket实例,然后用`connect()`函数连接到服务器的指定端口。在服务器端,同样使用`socket()`函数创建Socket,但之后要调用`bind()`绑定...