VC之socket套接字编程

来源:互联网 发布:装修攻略 知乎 编辑:程序博客网 时间:2024/05/19 20:45

网络编程中,通常使用socket套接字编程,那么该如何使用呢?接下来我们做一个最基本的小程序实现其功能。

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

服务器端

// SocketTestService.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Winsock2.h>#include <iostream>#include <string>#pragma comment(lib,"ws2_32.lib")using namespace std;void main(){    //加载套接字库    WORD wVersionRequested;    WSADATA wsaData;    int err;    wVersionRequested = MAKEWORD( 1, 1 );    err = WSAStartup( wVersionRequested, &wsaData );//该函数的功能是加载一个Winsocket库版本    if ( err != 0 ) {        return;    }    if ( LOBYTE( wsaData.wVersion ) != 1 ||        HIBYTE( wsaData.wVersion ) != 1 ) {            WSACleanup( );            return;     }    //创建套接字    SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);    SOCKADDR_IN addrSrv;    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    addrSrv.sin_family = AF_INET;    addrSrv.sin_port = htons(6000);    //将套接字绑定到端口上    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));    SOCKADDR_IN addrClient;    int len = sizeof(SOCKADDR);    char recvBuffer[300];//接收字符数据    memset((void*)recvBuffer,'\0',300);    cout<<"等待对方发送数据... "<<endl;    //接收数据    recvfrom(sockSrv,recvBuffer,300,0,(SOCKADDR*)&addrClient,&len);    cout<<"对方的地址为: "<<inet_ntoa(addrClient.sin_addr)<<endl;    cout<<"接收的内容为: "<<recvBuffer<<endl;    //发送数据    string sendBuffer = "this is server";    cout<<"向客户端方发送数据: "<<sendBuffer.c_str()<<endl;    sendto(sockSrv,sendBuffer.c_str(),sendBuffer.length() +1,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));    closesocket(sockSrv);//关闭服务器套接字    WSACleanup();//结束套接字库的调用    system("pause");}

客户端

// SocketTestClient.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <Winsock2.h>#include <iostream>#include <string>#pragma comment(lib,"ws2_32.lib")//加载动态连接库ws2_32.dll,提供了网络相关API的支持using namespace std;void main(){    //加载套接字库    WORD wVersionRequested;    WSADATA wsaData;    int err;    wVersionRequested = MAKEWORD( 1, 1 );    err = WSAStartup( wVersionRequested, &wsaData );//该函数的功能是加载一个Winsocket库版本    if ( err != 0 ) {        return;    }    if ( LOBYTE( wsaData.wVersion ) != 1 ||        HIBYTE( wsaData.wVersion ) != 1 ) {            WSACleanup( );            return;     }    //建立通讯 socket    SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);    SOCKADDR_IN addrSrv;    addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.68");    addrSrv.sin_family=AF_INET;    addrSrv.sin_port=htons(6000);//htons(DEFAULT_PORT)    //发送数据    string sendBuffer = "this is client!";    cout<<"向服务器方发送数据: "<<sendBuffer.c_str()<<endl;    sendto(sockClient,sendBuffer.c_str(),sendBuffer.length()+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));    //接收数据    char recvBuffer[300];//接收字符数据    memset((void*)recvBuffer,'\0',300);    int len = sizeof(SOCKADDR);    cout<<"等待对方发送数据... "<<endl;    recvfrom(sockClient,recvBuffer,300,0,(SOCKADDR*)&addrSrv,&len);    cout<<"主机的地址为: "<<inet_ntoa(addrSrv.sin_addr)<<endl;    cout<<"接收的内容为: "<<recvBuffer<<endl;    //结束通信    closesocket(sockClient);//关闭服务器套接字    WSACleanup();//结束套接字库的调用    system("pause");}

首先服务器端运行



然后客户端运行



查看服务器变化



源码下载



0 0
原创粉丝点击