网络通信编程初步:windows socket 程序示例

来源:互联网 发布:php财务系统源码 编辑:程序博客网 时间:2024/06/05 02:20

/***********************************************************************

**程序功能:演示使用windows socket进行网络通信

**程序包括:一个服务端线程、三个客户端线程,分别接收、发送数据

**完成日期:2009-5-23

**作者    :lauo

*************************************************************************/

#include<iostream>

//#include"sock.h"

#include<winsock2.h>

#include<windows.h>

using namespace std;

#pragma   comment(   lib,   "ws2_32.lib"    ) //使用了静态连接库

DWORD WINAPI Servicer(LPVOID param)

{

    WSADATA wsaData;

    int err;

    err=WSAStartup(MAKEWORD(1,1),&wsaData);

    if(err!=0)

    cout<<int(LOBYTE(wsaData.wVersion))<<"."<<int(HIBYTE(wsaData.wVersion))<<endl;

    //创建用于监听的套接字

    SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSrv;

    addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//本机地址

    //cout<<htonl(INADDR_ANY)<<endl;

    addrSrv.sin_family=AF_INET;//协议家族

    addrSrv.sin_port=htons(6000);//端口号

 

    //绑定套接字

    bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//第二个参数为要绑定的本机端口号及其地址等 端口与SOCKET绑定

    listen(sockSrv,50);//5---flags  将套接字置为监听模式(服务器端)

    SOCKADDR_IN addrClient;//客户端地址

    int len=sizeof(SOCKADDR);

    while(1)//服务死循环

    {

        SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//建立一个接收请求的套接字,用以与客户端打交道

        char recvBuf[256];

        //接收数据

        recv(sockConn,recvBuf,256,0);//阻塞式等待客户端的请求的到来

        //打印接收的数据

        cout<<recvBuf<<"   from:"<<inet_ntoa(addrClient.sin_addr)<<endl;//inet_ntoa(addrClient.sin_addr)显示了客户请示的地址

        closesocket(sockConn);

        //

    }

    return 0;

}

DWORD WINAPI Clienter(LPVOID param)

{

    WSADATA wsaData;

    int err;

    err=WSAStartup(MAKEWORD(1,1),&wsaData);

    if(err!=0)

        return 0;

    while(1)//线程死循环

    {    

        //创建用于发送数据的套接字

        SOCKET sockClt=socket(AF_INET,SOCK_STREAM,0);

 

        SOCKADDR_IN addrSrv;

        addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.1");

        //目标主机地址正确的本机地址应该为.168.0.1 或者主机网络IP(使用命令行命令:ipconfig 可以查看之)

        addrSrv.sin_family=AF_INET;//协议家族

        addrSrv.sin_port=htons(6000);//端口号

 

        err=connect(sockClt,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//建立一个网络链接,非阻塞方式,链接不上直接返回-1

        if(err==-1)//拉链不上服务器端

            continue;

        char sendBuf[256];//发达的数据缓冲区

        sprintf(sendBuf,"Welcome   to socket programing world ! at:clienter %d",*(int*)param);

        //发送数据

        err=send(sockClt,sendBuf,strlen(sendBuf)+1,0);//,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)) <<endl;;

        //cout<<"send:"<<err<<endl;

        closesocket(sockClt);//关闭此次链接

        Sleep(300*(rand()%5));

    }

    return 0;

}

int main()

{

    int p0=0,p1=1,p2=2;

    CreateThread(0,0,Servicer,0,0,0);//建立一个服务端线程

    CreateThread(0,0,Clienter,(void*)&p0,0,0) ;//建立了三个客户端线程,用以展示一个服务端对多个链接的服务

    CreateThread(0,0,Clienter,(void*)&p1,0,0) ;

    CreateThread(0,0,Clienter,(void*)&p2,0,0) ;

    while(1);//主线程死循环

return 1;

}

原创粉丝点击