使用套接字send 的时候发送结构strict xx{
 short head;
}send(server,(char*)xx,sizeof(xx),0);接的时候怎么接.服务器端提示收到信息了,.但是读取的时候会提示读取冲突.应该怎么读.可以给个    详细的例子   吗?========================================================问题二:为什么 我的服务器端只能接收一个客户端连接?windows socket 编程

解决方案 »

  1.   

    #pragma pack 1
    typedef struct _tagMyStruct{
      short head;
    }MyStruct, *LPMyStruct;
    #pragma pack发送(Client端):MyStruct A;
    A.head = 100;
    char *P = (char *)&A;
    int len = sizeof(A);
    while (len){
      int ret = send(Server, P, len, 0);
      if(SOCKET_ERROR == ret){
        count<<"send过程发生错误:"<<WSAGetLastError()<<endl;
        break;
      }
      if(!ret){
        count<<"send过程发生中连接已断开!"<<endl;
        break;
      }
      len -= ret;
      P += ret;
      if(!len){
        count<<"数据发送完毕."<<endl;
      }
    }
    监听(Server端):WSAData wsaData;
    if(WSAStartup(MAKEWORD(1,1), &wsaData)){
      count<<"WSAStartup 失败,错误号:"<<WSAGetLastError()<<endl;
      return;
    }SOCKET sock = socket(PF_INET,
         SOCK_STREAM,
                         0);
    if(INVALID_SOCKET == sock){
      count<<"调用socket失败:"<<WSAGetLastError()<<endl;
      WSACleanup();
      return;
    }
    const int port = 1234;
    struct sockaddr_in local;
    memset(&local, 0, sizeof(local));
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_family = AF_INET;
    local.sin_port = htons(port);//监听端口
    if(bind(sock, (struct sockaddr*)&local, sizeof(local)) == SOCKET_ERROR){
      count<<"调用bind到端口"<<port<<"失败,错误号:"<<WSAGetLastError()<<endl;
      closesocket(sock);
      WSACleanup();
      return;
    }if(listen(sock, SOMAXCONN)==SOCKET_ERROR){
      count<<"调用listen失败,错误号:"<<WSAGetLastError()<<endl;
      closesocket(sock);
      WSACleanup();
      return;
    }while(1){
      struct sockaddr_in remote_addr;
      memset(&remote_addr, 0, sizeof(sockaddr));
      int addr_len = sizeof(sockaddr);
      SOCKET sock_client = accept(sock, (struct sockaddr FAR*)&remote_addr, &addr_len);
      if(sock_client == INVALID_SOCKET){
        wsa_err = WSAGetLastError();
        switch(wsa_err){
          WSANOTINITIALISED: //
            return; 
          WSAECONNRESET: 
          WSAEFAULT:
          WSAEINPROGRESS:
          WSAEMFILE:
          WSAENOBUFS:
          WSAEWOULDBLOCK:
            continue; 
          WSAEINTR:
          WSAEOPNOTSUPP:
          WSAENETDOWN:// The network subsystem has failed.
          WSAEINVAL://The listen function was not invoked prior to accept.
            closesocket(sock);
          WSAENOTSOCK:
            WSACleanup(); 
            return;  
        }
      }
      count<<"有一个客户端连接过来:"<<sock_client<<endl;
      unsigned ThreadID;
      HANDLE pThread=(HANDLE)_beginthreadex(NULL,
                                             0,
                                             WorkerThread,
                                             &sock_client,
                                             CREATE_SUSPENDED,
                                             &ThreadID);
      if(!pThread){
        closesocket(sock_client);
        count<<"创建工作线程失败:"<<WSAGetLastError()<<endl;
        continue;
      }
      count<<"客户连接:"<<sock_client<<"交由线程:"<<ThreadID<<"处理!"<<endl;
      ResumeThread(pThread);//这里也要判断返回值
      CloseHandle(pThread);
    }
    closesocket(sock);
    WSACleanup();
    接收(Server端,采用多线程,用于处理多连接,如果要发送,与前面的Client端相似):unsigned WINAPI WorkerThread(LPVOID lpParam){
      SOCKET sock_client = (SOCKET) (*lpParam);
      WSAData wsaData;
      if(WSAStartup(MAKEWORD(1,1), wsaData)){
        closesocket(sock_client);
        _endthreadex(1);
        return 1;
      }  MyStruct A;
      char *P = (char *) &A;
      int len = sizeof(A);
      while(len){
        int ret = recv(sock_client, P, len, 0);
        if(SOCKET_ERROR == ret){
          count<<"Thread:"<<GetCurrentThreadId()<<" recv过程发生错误:"<<WSAGetLastError()<<endl;
          break;
        }
        if(!ret){
          count<<"Thread:"<<GetCurrentThreadId()<<" recv过程发生中连接已断开!"<<endl;
          break;
        }
        len -= ret;
        P += ret;
        if(len == 0)
          cout<<"Thread:"<<GetCurrentThreadId()<<" received from:"<<sock_client<<": A.head="<<A.head<<endl;
      }
      closesocket(sock_client);
      WSACleanup();
      _endthreadex(0);
    }
      

  2.   

       accept和receive函数
      

  3.   

    1、recv(client, (char*)xx, sizeof(xx), 0),要检查返回值。
    2、再执行accept。