Socket通信详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
bind(serversocket,(struct sockaddr *) &serveraddr,sizeof(serveraddr));
3).建立连接
客户程序可以通过connect函数来使客户sockets与监听服务器socket进行连接,如果连接成 功,connect函数返回0;如果失败则返回SOCKET_ERROR;
连接的状态,实时监控网络状态。
2)客户端请求,是指有你客户端的套接字提出连接请求,要连接的目标是服务器 的套接字。为此,客户端的套接字必须首先描述它(客户端套接字)所要连接的服务器的套 接字,指出服务器套接字的地址,端口号。然后向服务器发出连接请求。
3)连接确认,是指当服务器端的套接字监听到或者说接到客户端套接字的连接请 求,服务器端的套接字就建立起一个新的线程,把服务器端的套接字的描述发给客户端,一 旦客户端确认了此描述有效,连接就建立好了。而,服务器端套接字继续处于监听状态,继 续接受其他客户端套接字的连接请求。
4).监听状态
服务器可以通过listen函数使得流套接字处于监听状态。处于监听状态的套接字将维护一个 客户连接 队列,该队列最多容纳第二个参数个客户请求,如果执行成功,则返回0,否则返回 SOCKET_ERROR。
例如:
第2页
Socket listen(serversocket,5); 5).接受状态 程序可调用accept函数来接受数据。accept函数从处于监听的流套接字的客户连接请求队列 中取出排在最前的一个客户请求,并且创建一个新的客户套接字连接通道,如果连接成功, 就返回新创建的套接字的描述符,如果失败,则返回INVALID_SOCKET。该函数的第一个参数 指定处于监听状态的流套接字;第二个参数返回新创建的套接字的地址结构,第三个参数返 回新创建的套接字的地址结构的长度。 例如: accept(clientsocket,(struct sockaddr *) &serveraddr,sizeof(serveraddr)); 6).传送信息 应用程序通常用send函数向另一端发送信息。 第一个参数指定发送端套接字描述符; 第二个参数指名一个存放应用程序要发送数据的缓冲区; 第三个参数指名实际要发送的字节数; 第四个参数通常置0; 例如: send(clientsocket,buffer,256,0) 7).接受信息 应用程序通常用recv函数向另一端发送信息。 第一个参数指定接受端套接字描述符; 第二个参数指名一个缓冲区,用来接受数据; 第三个参数指名缓冲区的长度; 第四个参数通常置0; recv(serversocket,buffer,256,0) 8).关闭socket 例如: closesocket(serversocket)
例如:
struct sockaddr_in clientaddr; clientaddr.sin_family=AF_INET; clientaddr.sin_port=htons(8000); clientaddr.sin_addr.s_addr=inet_addr(192.168.3.24);
connect(clientsocket,(struct sockaddr *) &clientaddr,sizeof(clientaddr));
Struct socketaddr_in{
short sin_family; //置AF_INEF
u_short sin_port;
//指明端口号
Βιβλιοθήκη Baidu
struct in_addr sin_addr; //表示ip地址
char sin_zero[8];
}
例如:
struct sockaddr_in serveraddr; serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(8000); serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
2).绑定端口号
创建了一个套接字后,套接字数据有个默认的ip和端口号。一个服务器程序必须用bind为其 绑定一个ip地址和端口号。客户程序则不用绑定。该函数的第一个参数指定绑定的Socket描 述符,第二个参数指定一个Sockaddr结构。当对TCP/IP协议族的套接字进行绑定时,通常使 用以下地址结构
第1页
s1=socket(PF_INET,SOCK_STREAM,0);
Socket
第一个参数表示指定使用的协议(AF_INET和PF_INET),;
第二个参数表示指定的Socket类型(SOCK_STREAM和SOCK_DGRAM); 第三个参数表示通讯协议;
如果调用成功则返回新创建的套接字描述符,失败则返回INVALID_SOCKET。
4.常用Socket的类型:
1)流式Socket(SOCKET_STREAM) 流式是面向连接的TCP服务应用
2)数据报式Socket(SOCKET_DGRAM) 数据报是无连接的UDP应用
5.Socket相关的函数
1)int connect(SOCKET s,const struct sockaddr FAR *name,int namelen); 客户端socket通过该函数和服务器端socket连接,如果连接成功返回0,否则返回
7.阻塞和非阻塞模式 阻塞和非阻塞都是针对于服务器端的对client请求的处理的不同方式 1)阻塞模式:server端和client端的通信是处于同步的。在server端的socket直接实例 化,用create函数创建socket,然后调用listen函数进行监听是否有来自client端的 connect函数的连接请求。最后用一个while循环阻塞调用accept函数用于等待来自client端 的连接。如果这个阻塞是在主线程中进行的,则将会导致主线程的阻塞,因此需要创建一个 新的线程来运行socket服务, 如果server端和client端有连接,accept返回一个非0值,此时会解除阻塞,表示连接成 功,这是server端和client端彼此可以通信了。
SOCK_ERR 2)int listen(SOCKET s,int backlog );
服务器端socket用来监听是否有来自客户端的socket的信号 3)SOCKET accept(SOCKET s, struct sockaddr FAR *addr,int FAR *addrlen);
服务器调用该函数用来在Listen到得客户端请求序列中取第一个接受请求,并创建 一个新的客户套接字连接通道,如果连接成功,就返回新创建的套接字的描述符,如果失 败,则返回INVALID_SOCKET 4)int send(SOCKET s,const char FAR *buf,int len,int flags);
第4页
发送数据 5)int recv(SOCKET s,char FAR *buf,int len,int flags);
接收数据
6.Socket的使用步骤 #include <winsock2.h> //#include <windows.h> #pragma comment(lib,"ws2_32.lib") 1).建立一个socket 例如: socket s1;
Socket
Socket
1.用于描述IP地址和端口,是一个通信链的句柄。
2.socke是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实 例,操作这个实例,完成所需的会话。
3.Socket的连接过程: 1)服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是出于等待
第3页
Socket 2)非阻塞模式:利用socket事件的消息机制,server端和client端处于异步通信,无需创 建新的线程。 前期和阻塞模式是相同的,server端的socket直接实例化,用create函数创建socket,然后 调用listen函数进行监听是否有来自client的connect请求。若有请求,会触发FD_SOCKET事 件,同时server端的网络服务进程向server端的socket window发送事件通知消息 WM_SOCKET_TOTIY,然后响应。