在一台机器上模拟客户端和服务器端的简单vc的socket通信程序,最简单的那种。谢谢了

解决方案 »

  1.   

    我的mail : [email protected]
      

  2.   

    一下是我吃饭的程序,奉献给你了// sockconsole.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include "sockconsole.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifCWinApp theApp;
    using namespace std;#define SERVER//如果服务器则define 客户端则屏蔽此句#ifdef SERVER
    #define RUNIT server()
    #else
    #define RUNIT client()
    #endif#define MAX_THREADNUM 5
    void server();
    void gethostip();
    void client();
    DWORD WINAPI IOWithClient(LPVOID);int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); RUNIT;

    Sleep(60000);
    return 0;
    }void server()
    {
    printf("----------服务器端----------\n");
    //初始化套接字
    printf("初始化套接字...");
    WSADATA wsadata;
    if(WSAStartup(0x0101,&wsadata))
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    gethostip();
    //建立流套接字句柄
    printf("建立流套接字句柄...");
    SOCKET hSock=socket(AF_INET,SOCK_STREAM,0);
    if(hSock==INVALID_SOCKET)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n"); //绑定地址到套接字
    printf("绑定地址到套接字...");
    sockaddr_in addin;
    ZeroMemory(&addin,sizeof(addin));
    addin.sin_family=AF_INET;
    addin.sin_port=htons(33333);
    addin.sin_addr.S_un.S_addr=INADDR_ANY;
    if(bind(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n"); //进入监听状态
    printf("进入监听状态...");
    if(listen(hSock,MAX_THREADNUM)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    {
    printf("OK\n");
    }
    //接受连接
    printf("接受连接...");
    for(;;)
    {
    sockaddr_in clientaddin;
    int addinlength=sizeof(clientaddin);
    SOCKET *hConnected=new SOCKET;
    if((* hConnected=accept(hSock,(sockaddr *)(&clientaddin),&addinlength))==INVALID_SOCKET)
    {
    printf("失败!\n");
    delete hConnected;
    }
    else
    {
    char * ipclient;
    ipclient=inet_ntoa(clientaddin.sin_addr);
    printf("Come From %s OK\n",ipclient);
    HANDLE hThread;
    hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IOWithClient,(LPVOID)hConnected,0,NULL);
    }
    } //关闭SOCKET
    printf("关闭SOCKET...");
    if(closesocket(hSock)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    //卸载SOCKET
    printf("卸载SOCKET...");
    if(WSACleanup()==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    }
    void client()
    {
    timeval timeout;
    int result;
    fd_set set;
    memset(&set,0,sizeof(fd_set));
    memset(&timeout,0,sizeof(timeval)); printf("----------客户端----------\n");
    //初始化套接字
    printf("初始化套接字...");
    WSADATA wsadata;
    if(WSAStartup(0x0101,&wsadata))
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n"); //建立流套接字句柄
    printf("建立流套接字句柄...");
    SOCKET hSock=socket(AF_INET,SOCK_STREAM,0);
    if(hSock==INVALID_SOCKET)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    //连接服务器地址
    printf("连接服务器地址...");
    sockaddr_in addin;
    ZeroMemory(&addin,sizeof(addin));
    addin.sin_family=AF_INET;
    addin.sin_port=htons(33333);
    char tempgetip[20];
    scanf("%s",tempgetip);
    addin.sin_addr.S_un.S_addr=inet_addr(tempgetip);
    if(connect(hSock,(sockaddr *)(&addin),sizeof(addin))==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n"); //判断是否可写
    printf("判断是否可写...");
    FD_ZERO(&set);
    FD_SET(hSock,&set);
    timeout.tv_sec=2;
    if((result=select(0,NULL,&set,NULL,&timeout))==0)
    printf("判断服务器端是否可写超时!\n");
    else if(result==SOCKET_ERROR)
    {
    printf("失败!");
    return;
    }
    else
    printf("OK\n");
    //发送数据
    printf("发送数据...");
    char buffer[100];
    sprintf(buffer,"来自客户端的数据:Data from client......!");
    if((result=send(hSock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    memset(buffer,0,sizeof(buffer)); //判断是否可读
    printf("判断是否可读...");
    FD_ZERO(&set);
    FD_SET(hSock,&set);
    timeout.tv_sec=2;
    if((result=select(0,&set,NULL,NULL,&timeout))==0)
    printf("判断服务器端是否可读超时!\n");
    else if(result==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    //接收数据
    printf("接收数据...");
    if((result=recv(hSock,buffer,sizeof(buffer),0))==0)
    printf("读取服务器端时客户端已经关闭!\n");
    else if(result==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else 
    printf("%s\n",buffer);
    //禁止SOCKET
    printf("禁止SOCKET...");
    if(shutdown(hSock,SD_BOTH)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n"); //关闭SOCKET
    printf("关闭SOCKET...");
    if(closesocket(hSock)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    //卸载SOCKET
    printf("卸载SOCKET...");
    if(WSACleanup()==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    }void gethostip()
    {
    printf("获得主机名...");
    char hostname[128];
    if(gethostname (hostname,128)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return;
    }
    else
    printf("OK\n");
    hostent *host=gethostbyname(hostname);//可以是域名"www.163.com"
    printf("获得主机IP地址...");
    if(host==NULL)
    {
    printf("失败!\n");
    return;
    }
    char *ip;
    in_addr in;
    for(int i=0;host->h_addr_list[i]!=NULL;i++)
    {
    memmove(&in,host->h_addr_list[i],4);
    ip=inet_ntoa(in);
    printf("主机的IP地址为:%s\n",ip);
    }
    }
    DWORD WINAPI IOWithClient(LPVOID para)
    {

    SOCKET sock=*((SOCKET *)para);
    timeval timeout;
    int result;
    fd_set set;
    memset(&set,0,sizeof(fd_set));
    memset(&timeout,0,sizeof(timeval));
    //设置非阻塞模式
    /*printf("设置非阻塞模式...");
    DWORD value=1;
    if(ioctlsocket(sock,FIONBIO,&value)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n");*/ //判断是否可读
    printf("判断是否可读...");
    FD_ZERO(&set);
    FD_SET(sock,&set);
    timeout.tv_sec=2;
    if((result=select(0,&set,NULL,NULL,&timeout))==0)
    {
    printf("判断客户端是否可读超时!");
    }
    else if(result==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n");
    //接收数据
    printf("接收数据...");
    char buffer[100];
    if((result=recv(sock,buffer,sizeof(buffer),0))==0)
    printf("读取客户端时客户端已经关闭!\n");
    else if(result==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else 
    printf("%s\n",buffer);
    memset(buffer,0,sizeof(buffer));
    //判断是否可写
    printf("判断是否可写...");
    FD_ZERO(&set);
    FD_SET(sock,&set);
    timeout.tv_sec=2;
    if((result=select(0,NULL,&set,NULL,&timeout))==0)
    printf("判断客户端是否写读超时!");
    else if(result==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n");
    //发送数据
    printf("发送数据...");
    sprintf(buffer,"来自服务器端的数据:Data from server......!");
    if((result=send(sock,buffer,strlen(buffer)+1,0))==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n");
    //禁止SOCKET
    printf("禁止SOCKET...");
    if(shutdown(sock,SD_BOTH)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n");
    //关闭SOCKET
    printf("关闭SOCKET...");
    if(closesocket(sock)==SOCKET_ERROR)
    {
    printf("失败!\n");
    return -1;
    }
    else
    printf("OK\n"); delete (SOCKET *)para;
    return 0;
    }
      

  3.   

    服务端:
    引入winsock.h
    1、初始化winsock---WSAStartup()
    2、构造监听套接字  socket()
    3、bind()绑定该套接字
    4、listen()开始监听
    5、accept()等待客户的连接
    客户:
    引入winsock.h
    1、初始化winsock---WSAStartup()
    2、构造监听套接字  socket()
    3、bind()绑定该套接字
    4、connect()连接服务
    然后两者都用recv()和send()接发数据
      

  4.   

    shenxin197735(有点菜):
     
    好象不能用啊!