2010-10-27 47 views
0

我已經創建了一個基於c + +的客戶端和服務器程序,我在Windows套接字上。 我有一些問題,當我執行程序沒有消息出現在服務器端,然後程序退出。數據發送到服務器,但它沒有反應回來。客戶端/服務器程序在c + +中的問題

我正在粘貼下面

****Server code 
===========**** 

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <iphlpapi.h> 
#include <stdio.h> 
#include <conio.h> 

#define DEFAULT_PORT  "27015" 
#define DEFAULT_BUFLEN  512 
#pragma comment(lib, "Ws2_32.lib") 

int main() { 
    WSADATA wsdata; 
    int result = WSAStartup(MAKEWORD(2,2),&wsdata); 
    if(result != 0){ 
     printf("%s","Unable to initilize windows socket\n"); 
     getch(); 
     return 1; 
    } 
    struct addrinfo *addrResult = NULL,hints; 
    ZeroMemory(&hints, sizeof (hints)); 

    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_flags = AI_PASSIVE; 

    result = getaddrinfo(NULL,DEFAULT_PORT,&hints,&addrResult); 
    if(result != 0){ 
     printf("%s","Error in getaddrInfo"); 
     getch(); 
     return 1; 
    } 
    SOCKET listenSocket = INVALID_SOCKET; 
    listenSocket = socket(addrResult->ai_family,addrResult->ai_socktype,addrResult->ai_protocol); 
    if(listenSocket == INVALID_SOCKET){ 
     printf("%s","Error in creating socket object\n"); 
     getch(); 
     closesocket(listenSocket); 
     WSACleanup(); 
     return 1; 
    } 

    sockaddr_in service; 
    service.sin_family = AF_INET; 
    service.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    service.sin_port = htons(27015); 

    if(bind(listenSocket,addrResult->ai_addr, 
     (int)addrResult->ai_addrlen) == SOCKET_ERROR){ 
    //if(bind(listenSocket,(SOCKADDR*) &service, 
    // sizeof(service)) == SOCKET_ERROR){ 

     printf("bind failed: %d\n", WSAGetLastError()); 
     freeaddrinfo(addrResult); 
     closesocket(listenSocket); 
     WSACleanup(); 
     getch(); 
     return 1; 

    } 
    freeaddrinfo(addrResult); 
    if(listen(listenSocket,SOMAXCONN) == SOCKET_ERROR){ 
     printf("%s","Error in listening socket"); 
     getch(); 
     closesocket(listenSocket); 
     WSACleanup(); 
    } 
    SOCKET clientSocket = INVALID_SOCKET; 
    clientSocket = accept((listenSocket,NULL,NULL); 
    if(clientSocket == INVALID_SOCKET){ 
     closesocket(listenSocket); 
     WSACleanup(); 
    } 

    char recvbuf[DEFAULT_BUFLEN]; 
    int iRecvResult, iSendResult; 
    int recvbuflen = DEFAULT_BUFLEN; 

    do{ 
     iRecvResult = 0; 
     iSendResult = 0; 
     iRecvResult = recv(clientSocket,recvbuf,recvbuflen,0); 
     if(iRecvResult > 0){ 
      printf("Bytes received: %d\n", iRecvResult); 
      getch(); 
      // Echo the buffer back to the sender 
      iSendResult = send(clientSocket, recvbuf, iRecvResult, 0); 
      if (iSendResult == SOCKET_ERROR) { 
       printf("send failed: %d\n", WSAGetLastError()); 
       closesocket(clientSocket); 
       WSACleanup(); 
       return 1; 
      } 
      printf("Bytes sent: %d\n", iSendResult); 
     } 
     else if (iRecvResult == 0){ 
      printf("Connection closing...\n"); 
     } 
     else{ 
      printf("recv failed: %d\n", WSAGetLastError()); 
      closesocket(clientSocket); 
      WSACleanup(); 
      return 1; 
     } 
    }while(iRecvResult > 0); 
    getch(); 
    return 0; 
} 


**client code 
============** 


#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <iphlpapi.h> 
#include <stdio.h> 
#include <conio.h> 

#define DEFAULT_PORT  "27015" 
#define DEFAULT_BUFLEN  512 
#pragma comment(lib, "Ws2_32.lib") 

int main(){ 
    WSADATA wsdata; 
    WSAStartup(MAKEWORD(2,2),&wsdata); 
    struct addrinfo *addrResult = NULL,hints; 
    ZeroMemory(&hints, sizeof (hints)); 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_family = AF_UNSPEC; 
    int result = 0; 
    if(getaddrinfo("127.0.0.1",DEFAULT_PORT, 
     &hints,&addrResult)){ 
      printf("%s","Error in getaddrInfo\n"); 
      WSACleanup(); 
      getch(); 
      return 1; 
    } 
    SOCKET connectingSocket = INVALID_SOCKET; 
    connectingSocket = socket(addrResult->ai_family,addrResult->ai_socktype, 
     addrResult->ai_protocol); 
    if(connectingSocket == INVALID_SOCKET){ 
     printf("%s","Error in creating socket\n"); 
     freeaddrinfo(addrResult); 
     WSACleanup(); 
     getch(); 
     return 1; 
    } 

     if(connect(connectingSocket,addrResult->ai_addr, (int)addrResult->ai_addrlen) != 0){ 
     closesocket(connectingSocket); 
     connectingSocket = INVALID_SOCKET; 
     WSACleanup(); 

    } 
    freeaddrinfo(addrResult); 

    int recvbuflen = DEFAULT_BUFLEN; 
    char *sendbuf = "this is a test"; 
    char recvbuf[DEFAULT_BUFLEN]; 

    int iResult; 

    // Send an initial buffer 
    iResult = send(connectingSocket, sendbuf, (int) strlen(sendbuf), 0); 
    if (iResult == SOCKET_ERROR) { 
     printf("send failed: %d\n", WSAGetLastError()); 
     closesocket(connectingSocket); 
     WSACleanup(); 
     return 1; 
    } 

    printf("Bytes Sent: %ld\n", iResult); 

    // shutdown the connection for sending since no more data will be sent 
    // the client can still use the connectingSocket for receiving data 
    iResult = shutdown(connectingSocket, SD_SEND); 
    if (iResult == SOCKET_ERROR) { 
     printf("shutdown failed: %d\n", WSAGetLastError()); 
     closesocket(connectingSocket); 
     WSACleanup(); 
     return 1; 
    } 

    // Receive data until the server closes the connection 
    do { 
     iResult = recv(connectingSocket, recvbuf, recvbuflen, 0); 
     if (iResult > 0) 
      printf("Bytes received: %d\n", iResult); 
     else if (iResult == 0) 
      printf("Connection closed\n"); 
     else 
      printf("recv failed: %d\n", WSAGetLastError()); 
    } while (iResult > 0); 




    getch(); 
    return 0; 
} 

你的幫助,我的代碼是高度讚賞它不工作對我的N =機器有些人說這個代碼是自己的機器上運行良好。我已經使用Visual Studio 2005來開發這個和我的操作系統是Windows 7

+0

什麼樣的問題? – JoshD 2010-10-27 00:10:10

+0

或者如果你在C++中有任何示例代碼正在做同樣的事情,你可以把它給我參考。所以我會檢查我錯在哪裏。 – 2010-10-27 00:10:17

+0

從你的解釋中不清楚你在服務器端看到了什麼。服務器代碼是否到達接收循環?如果是這樣,它打印什麼(它必須在所有執行路徑上打印)?如果不是,它在哪裏退出? – user434507 2010-10-27 00:14:14

回答