基于windows 32的socket编程及措施实现
当前位置:以往代写 > C/C++ 教程 >基于windows 32的socket编程及措施实现
2019-06-13

基于windows 32的socket编程及措施实现

基于windows 32的socket编程及措施实现

副标题#e#

劈头研究了win32平台的Windows Sockets,它是Microsoft Windows的网络措施设计接口,它是从Berkeley Sockets扩展而来的,以动态链接库的形式提供应我们利用。包罗流式套接字(提供面向毗连、靠得住的数据传输处事,数据无过错、无反复的发送,且按发送顺序吸收。)和数据报套接字(提供无毗连处事。数据包以独立包形式发送,不提供无错担保,数据大概丢失或反复,而且吸收顺序杂乱。)、原始套接字。

CS模子:在TCP/IP网络应用中,通信的两个历程间彼此浸染的主要模式是客户机/处事器模式(client/server),即客户向处事器提出请求,处事器吸收到请求后,提供相应的处事。

基于TCP(面向毗连)的socket编程:

Sever处事器端措施: 1、建设套接字(socket)。 2、将套接字绑定到一个当地地点和端口上(bind)。 3、将套接字设为监听模式,筹备吸收客户请求(listen)。 4、期待客户请求到来;当请求到来后,接管毗连请求,返回一个新的对应于此次毗连的套接字(accept)。 5、用返回的套接字和客户端举办通信(send/recv)。 6、返回,期待另一客户请求。 7、封锁套接字。

Client客户端措施: 1、建设套接字(socket)。 2、向处事器发出毗连请求(connect)。 3、和处事器端举办通信(send/recv)。 4、封锁套接字。

TCP/IP模子编程流程如下图:

基于windows 32的socket编程及法子实现


#p#副标题#e#

Socket的处事器段具体注释代码:

// server6.cpp : Defines the entry point for the console application.
//
//TcpServer.cpp
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
using namespace std;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//SDK这个宏建设一个无标记16位整形,通过毗连两个给定的无标记参数。暗示1.1版本
err = WSAStartup( wVersionRequested, &wsaData );//通过WSAStartup函数完成对Winsock处事的初始化,挪用socket必需初始化
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//假如版本错误返回
 {
    WSACleanup( );//释放WSAStartup
    return;
}
SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);  //成立当地流式套接字,返回套接字号;af_inet地点族,用流式套接字,自动匹配
SOCKADDR_IN addrSrv;//TCP/IP的地点信息
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//答允套接字向任何分派给当地呆板的IP地点发送或吸收数据。
addrSrv.sin_family = AF_INET;//TCP指定的
addrSrv.sin_port = htons(6000);//端标语
bind(sockSrv,(sockaddr*)&addrSrv,sizeof(SOCKADDR));//绑定套接字
listen(sockSrv,5);//#####监听当地套接字
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char revBuf[100],sendBuf[100];
    
while(1)
{
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接管链接期待客户端链接,返回客户套接字
char sendBuf[100];
cout<<"我说:\n";
//sprintf(sendBuf,"Welcome %s to chat with me!",inet_ntoa(addrClient.sin_addr));
cin>>sendBuf;
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    
    
recv(sockConn,revBuf,100,0);
cout<<"对方说:\n";
printf("%s\n",revBuf);
memset(revBuf,0,100);
closesocket(sockConn);
}
closesocket(sockSrv);
}

Socket的客户打量细注释代码:

//TcpClient.cpp
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>
using namespace std;
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );//初始化
if ( err != 0 )
    {
                    return;
    }
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
 {
    WSACleanup( );
    return;
}
SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);//成立套接字
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//"49.152.49.84");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//毗连到目标主机
char recvBuf[100],sendBuf[100];
while (true)
{
        
    recv(sockClient,recvBuf,100,0);
    cout<<"对方说:";
    printf("%s\n",recvBuf);
    memset(recvBuf,0,100);
    cout<<"我说:";
    cin>>sendBuf;
    send(sockClient,sendBuf,strlen(sendBuf)+1,0);
}
    
closesocket(sockClient);//封锁套接字
WSACleanup();
}

作者:cnblogs zCoderJoy

    关键字:

在线提交作业