各大哥,帮我看看我的代码,我想有不少地方是错的,但看后先不要吐血就行,帮我改一下^__^
#include<winsock2.h>
#include<iostream.h>
void main(int argc , char *argv[])
{
    WSADATA            wsadata;
    SOCKET            sock;
    SOCKADDR_IN        serveraddr;
    int                port = 5150;
    int                ret;
    char buf[1024],ch;
    int i=0;
    if (argc <1))//是用于调试的,这样可以不用参数就可以运行,正式时会把他改为2    {
        cout<<"这是一个客户端,请输入服务端地址.\nclient.exe <IP address> <port>\n";
        return;
    }
    if((ret= WSAStartup(MAKEWORD(2,2), &wsadata))!= 0)
    {
        cout<<"WINSOCK 初始化失败."<<endl;
        return;
    }
    if((sock=socket(AF_INET,SOCK_STREAM,6))==INVALID_SOCKET)
    {
        cout<<"SOCKET 建立失败在: "<<WSAGetLastError();
        WSACleanup();
        return;
    }
    
    serveraddr.sin_family = AF_INET;
    //serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_port = htons(port);
    //serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cout<<"尝试连接 "<<inet_ntoa(serveraddr.sin_addr)<<":"<<port<<" 中\n";
    
    if(connect(sock,(SOCKADDR *)&serveraddr,sizeof(serveraddr))== SOCKET_ERROR)
    {
        cout<<"连接失败在: "<<WSAGetLastError()<<endl;
        closesocket(sock);
        WSACleanup();
        return;
    }
    cout<<"可以进行通信了."<<endl;
    while(1)
    {
        cout<<"发到"<<inet_ntoa(serveraddr.sin_addr)<<": ";
//用&&'\n'才是本意,但用了后不能发送到服务端
        while(cin.get(ch)&&'\n'))//这个不会改啊,只是想把输入的东西,只要回家,就可以发送,要怎么写啊
        {
            buf[i]=ch;
            i++;
        }
//这里有问题,改为send(sock, buf, i, 0)就不行了,还有什么每发一个字他就输出一次成功?
        if((ret = send(sock, "buf",1024, 0))== SOCKET_ERROR)
        {
            cout<<"...\n发送失败,"<<WSAGetLastError() ;
        }
        //cout<<"发送成功\n";
    i=0;
    }
    
    cout<<"断开连接\n";
    closesocket(sock);
    WSACleanup();
}
//是不是每一个CONNECT只能发一次信息?为什么第一次之后的服务端就收不到了 

解决方案 »

  1.   

    用多线程啊
    下面是用C写的,实现了多个客户连接服务器,服务器负责把每个客户端的数据转发给所有客户。转成C++应该很简单吧
    //client
    #include "winsock2.h"
    #include "stdio.h"
    SOCKET init(char *ip,short port);
    void showmessage(LPVOID lpv);
    //process_cli(SOCKET clientfd);void main()
    {
    char buf[100];
    char talk[100];
    char ipselect[7];
    HANDLE handles[100];
    unsigned long myID;
    int numServed=0;
    //FILE *stream;
    SOCKET listenfd;
    memset(buf,100,0);
    //printf("请输入服务器地址:");
    //gets(ipselect);
    listenfd=init("127.0.0.1",8001);
    // process_cli(listenfd);
    // closesocket(listenfd);
    while(strcmp(talk,"bye")!=0)
    {
    handles[numServed]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)showmessage,
    (LPVOID)listenfd,0,&myID);
    //printf("请输入聊天信息>");
    gets(talk);
    //scanf("%s",talk);
    send(listenfd,talk,sizeof(talk),0);
    numServed++;
    }
    }
    void showmessage(LPVOID lpv)
    {
    SOCKET listenfd=(SOCKET)lpv;
    char buf[100]="1";
    while(buf)
    {
    if(recv(listenfd,buf,100,0) == SOCKET_ERROR)
    {
    printf("接收数据发生错误,%d\n",WSAGetLastError());
    return;
    }

    printf("%s\n",buf);
    }
    }
    SOCKET init(char *ip,short port)
    {
    SOCKET listenfd;
    sockaddr_in server;
    WSADATA ws;
    WSAStartup(MAKEWORD(2,1),&ws);
    listenfd=socket(PF_INET,SOCK_STREAM,0);

    server.sin_addr.S_un.S_addr=inet_addr(ip);
    server.sin_family=PF_INET;
    server.sin_port=htons(port);
    if(connect(listenfd,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
    {
    printf("无法连接服务器!\n");
    return 0;
    } if(listenfd==INVALID_SOCKET)
    {
    printf("无法创建服务器socket,%d\n",WSAGetLastError());
    return 0;
    }

    return listenfd;
    }
    //server
    #include "winsock2.h"
    #include "stdio.h"
    int numServed=0;
    SOCKET clisocket[100];
    SOCKET init(u_short port);
    struct ARG
    {
    SOCKET fd;
    sockaddr_in ip;
    char clientname[100];
    };
    void process_client(LPVOID lpv);
    void process_send(LPVOID lpv);
    void main()
    {
    ARG arg;
    int size;
    SOCKET listenfd,acceptfd;
    int numServed2=0;
    struct sockaddr_in client;
    HANDLE handle1[100],handle2[100];
    unsigned long myid1,myid2;
    size=sizeof(client);
    listenfd=init(8001);
    listen(listenfd,1);
    printf("Listen in 8001.\n");
    while(numServed<100)
    {
    acceptfd=accept(listenfd,(sockaddr *)&client,&size);
    arg.fd=acceptfd;
    arg.ip=client;
    clisocket[numServed]=acceptfd;
    //process_client(acceptfd,client);
    handle1[numServed]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_client,(LPVOID)&arg,0,&myid1);
    if(handle1[numServed]=NULL)
    printf("Failure!");
    handle2[numServed2]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_send,(LPVOID)&arg,0,&myid2);
    if(handle2[numServed2]=NULL)
    printf("Failure!");
    numServed++;
    numServed2++;
    }
    }
    SOCKET init(u_short port)
    {
    SOCKET listenfd;
    struct sockaddr_in server;
    WSADATA WSAdata;
    WSAStartup(MAKEWORD(2,1),&WSAdata);


    listenfd=socket(AF_INET,SOCK_STREAM,0);
    server.sin_family=PF_INET;
    server.sin_addr.S_un.S_addr=INADDR_ANY;
    server.sin_port=htons(port);

    bind(listenfd,(struct sockaddr *)&server,sizeof(server));
    listen(listenfd,5);
    printf("server running! listen on %d\n",port);
    return listenfd;
    }
    void process_client(LPVOID lpv)
    {
    char buf[100];
    int i;
    sockaddr_in client;
    struct ARG *arg;
    arg=(ARG *)lpv;
    SOCKET acceptfd=arg->fd;
    client=arg->ip;
    memset(buf,100,0);
    if(acceptfd==INVALID_SOCKET)
    printf("Error:accept failed\n");
    while(1)
    {
    if(recv(acceptfd,buf,sizeof(buf),0)==-1)
    {
    printf("the client has leave!\n");
    break;
    }
    printf("%s says:",inet_ntoa(client.sin_addr));
    printf("%s\n",buf);
    if(strcmp(buf,"bye")!=0)
    {
    for(i=0;i<numServed;i++)
    {
    printf("Send to %i\n",i);
    send(clisocket[i],strcat(strcat(inet_ntoa(client.sin_addr),":"),buf),100,0);
    }
    }
    else
    {
    break;
    }
    }
    //send(acceptfd,buf,sizeof(buf),0);}
    void process_send(LPVOID lpv)
    {
    char sendbuf1[100];
    char b[100]="服务器对所有用户说:";
    int a;
    struct ARG* accept_sd=(struct ARG*)lpv;
    while(1)
    {
         memset(sendbuf1,0,sizeof(sendbuf1));
         gets(sendbuf1);
            for(a=0;a<numServed;a++)
    {
    send(clisocket[a],b,100,0);
             send(clisocket[a],sendbuf1,100,0);
    }
    }
    }