MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 服务器发送消息给客服端的有关问题

服务器发送消息给客服端的有关问题

www.MyException.Cn  网友分享于:2015-08-26  浏览:22次
服务器发送消息给客服端的问题
问题描述:服务器一个,客服端两个,现在服务器给客服端发消息,却只有一个客服端收到,然后再发又只有一个收到,不过这个时候是另一个客服端收到,依次轮流收到服务器的信息,感觉有些奇怪,有些问题是想不明白
C/C++ code

//服务器端代码:
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib,"ws2_32.lib")

/*recive message thread*/
DWORD WINAPI ClientThread(LPVOID lp)
{
    SOCKET sock = (SOCKET)lp;//----------
    char szbuff[1024];
    int ret;
    while(1)
    {
        //perform a blocking recv() call
        ret = recv(sock,szbuff,1024,0);
        if(ret == 0)
            break;
        else if(ret == SOCKET_ERROR)
        {
            cout << "recv() failed " << WSAGetLastError() << endl;
            break;
        }
        szbuff[ret] = '\0';
        cout << "RECV:" << szbuff <<  " " << ret << "bytes" << endl;
    }
    return 0;
}

/*send message thread*/
DWORD WINAPI SendThread(LPVOID lp)
{
    SOCKET sock = (SOCKET)lp;
    char buff[1024];
    string msg;
    int ret;
    while(1)
    {
        cin >> msg;
        char buff[1024];
        strcpy(buff,msg.c_str());
        ret = send(sock,buff,msg.length() + 1,0);
        if(ret == 0)
            break;
        else if(ret == SOCKET_ERROR)
        {
            cout << "send failed " << WSAGetLastError() << endl;
            break;
        }
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    //cout << *(int*)lp << endl;
    //Initialize Winsock
    WSADATA wsd;
    if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
    {
        cout << "Failled to load Winsock!" << endl;
        return 1;
    }
    //create our listening socket
    SOCKET sListen,sClient;
    sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if(sListen == SOCKET_ERROR)
    {
        cout << "socket() failed " << WSAGetLastError() << endl;
        return 1;
    }
    //Select local interface and bind to it
    struct sockaddr_in local,client;
    int iport = 5000;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(iport);
    local.sin_family = AF_INET;
    if(bind(sListen,(SOCKADDR*)&local,sizeof(local)) == SOCKET_ERROR)
    {
        cout << "bind() failed " << WSAGetLastError() << endl;
        return 1;
    }
    listen(sListen,8);
    cout << "server side is in listening status!" << endl;
    //Waitfor incoming clients,Once one is detected,create thread and pass
    //the handle off to it
    int iAddrSize(0);
    HANDLE hThread;
    DWORD dwThreadId,dwSendThreadId;
    while(1)
    {
        iAddrSize = sizeof(client);
        sClient = accept(sListen,(SOCKADDR*)&client,&iAddrSize);
        if(sClient == INVALID_SOCKET)
        {
            cout << "accept() failed " << WSAGetLastError() << endl;
            break;
        }
        cout << "Accept client:" << inet_ntoa(client.sin_addr) << endl;
        cout << ntohs(client.sin_port) << endl;

        hThread = CreateThread(NULL,0,ClientThread,
            (LPVOID)sClient,0,&dwThreadId);
        HANDLE hSendThread = CreateThread(NULL,0,SendThread,
            (LPVOID)sClient,0,&dwSendThreadId);
        if(hThread == NULL)
        {
            cout << "CreateThread() failed " << GetLastError() << endl;
            break;
        }
        CloseHandle(hThread);
        CloseHandle(hSendThread);
    }
    closesocket(sListen);
    WSACleanup();
    return 0;
}

C/C++ code

//客服端代码:
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")

/*recive message thread*/
DWORD WINAPI ClientThread(LPVOID lp)
{
    SOCKET sock = (SOCKET)lp;
    char szbuff[1024];
    int ret;
    while(1)
    {
        ret = recv(sock,szbuff,1024,0);
        if(ret == 0)
            break;
        else if(ret == SOCKET_ERROR)
        {
            cout << "recv() failed " << WSAGetLastError() << endl;
            break;
        }
        szbuff[ret] = '\0';
        cout << "recv " << szbuff << " " << ret << "bytes" << endl;
    }
    return 0;
}
/*send message thread*/
DWORD WINAPI SendThread(LPVOID lp)
{
    SOCKET sock = (SOCKET)lp;
    string msg;
    char buff[1024];
    int ret;
    while(1)
    {
        cin >> msg;
        strcpy(buff,msg.c_str());
        ret = send(sock,buff,msg.length() + 1,0);
        if(ret == 0)
            break;
        else if(ret == SOCKET_ERROR)
        {
            cout << "send failed " << WSAGetLastError() << endl;
            break;
        }
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    WSADATA wsd;
    SOCKET  sClient;
    struct sockaddr_in server;
    struct hostent *host = NULL;
    //load Winsock
    if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
    {
        cout << "Failled to load Winsock!" << endl;
        return 1;
    }
    //create socket and attempt to connect to the server
    sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if(sClient == INVALID_SOCKET)
    {
        cout << "socket failed " << WSAGetLastError() << endl;
        return 1;
    }
    string szServer;
    u_long iport;
    cout << "please input IP address: " << endl;
    cin >> szServer;
    cout << "please input port number: " << endl;
    cin >> iport;
    server.sin_addr.s_addr = inet_addr(INADDR_ANY);
    server.sin_family = AF_INET;
    server.sin_port = htons(iport);
    //if the supplied server address isn't in the form
    //"aaa.bbb.ccc.ddd" it's a host name,so try to resolve it
    if(server.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServer.c_str());
        if(host == NULL)
        {
            cout << "unable to resolve server: " << szServer << endl;
            return 1;
        }
        CopyMemory(&server.sin_addr,host->h_addr_list[0],host->h_length);
    }
    
    if(connect(sClient,(SOCKADDR*)&server,sizeof(server))==SOCKET_ERROR)
    {
        cout << "connect failed " << WSAGetLastError() << endl;
        return 1;
    }
    cout << "connect succeed!" << endl;
    DWORD dwThreadId,dwSendThreadId;
    HANDLE hThread = CreateThread(NULL,0,ClientThread,
            (LPVOID)sClient,0,&dwThreadId);
    HANDLE hSendThread = CreateThread(NULL,0,SendThread,
            (LPVOID)sClient,0,&dwSendThreadId);
    if(hThread == NULL)
    {
        cout << "CreateThread() failed " << GetLastError() << endl;
    }
    if(hSendThread == NULL)
    {
        cout << "CreateThread() failed " << GetLastError() << endl;
    }
    CloseHandle(hThread);
    CloseHandle(hSendThread);

    //prevent main thread exit;
    while(1)
    {

    }
    closesocket(sClient);
    WSACleanup();
    return 0;
}

文章评论

程序员的鄙视链
程序员的鄙视链
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
如何成为一名黑客
如何成为一名黑客
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
那些争议最大的编程观点
那些争议最大的编程观点
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
总结2014中国互联网十大段子
总结2014中国互联网十大段子
每天工作4小时的程序员
每天工作4小时的程序员
漫画:程序员的工作
漫画:程序员的工作
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
一个程序员的时间管理
一个程序员的时间管理
程序员和编码员之间的区别
程序员和编码员之间的区别
 程序员的样子
程序员的样子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
旅行,写作,编程
旅行,写作,编程
程序员应该关注的一些事儿
程序员应该关注的一些事儿
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
Java程序员必看电影
Java程序员必看电影
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员都该阅读的书
程序员都该阅读的书
我是如何打败拖延症的
我是如何打败拖延症的
老程序员的下场
老程序员的下场
为什么程序员都是夜猫子
为什么程序员都是夜猫子
中美印日四国程序员比较
中美印日四国程序员比较
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
代码女神横空出世
代码女神横空出世
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
10个调试和排错的小建议
10个调试和排错的小建议
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有