2016-09-28 89 views
0

我C#創建兩個應用程序服務器和客戶端,他們幹活需要改變客戶端應用程序C++。這裏是我的C#代碼:將數據發送到TCP /端口在C++中的Visual Studio

  m_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      IPAddress ip = IPAddress.Parse("127.0.0.1"); 
      int iPortNo = System.Convert.ToInt16("5000"); 
      IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo); 
      m_clientSocket.Connect(ipEnd); 
      if (m_clientSocket.Connected) 
      { 
        byte[] packet = CreateMessage("salam"); 
        if (m_clientSocket != null) 
        { 
         m_clientSocket.Send(packet); 
        } 

      } 

它的偉大工程,所以我一派c++ client code tcp我發現這個網址

https://msdn.microsoft.com/en-us/library/windows/desktop/ms737591%28v=vs.85%29.aspx 

這裏是上面的URL代碼

#define WIN32_LEAN_AND_MEAN 

#include <windows.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdlib.h> 
#include <stdio.h> 


// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib 
#pragma comment (lib, "Ws2_32.lib") 
#pragma comment (lib, "Mswsock.lib") 
#pragma comment (lib, "AdvApi32.lib") 


#define DEFAULT_BUFLEN 512 
#define DEFAULT_PORT "27015" 

int __cdecl main(int argc, char **argv) 
{ 
    WSADATA wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    struct addrinfo *result = NULL, 
     *ptr = NULL, 
     hints; 
    char *sendbuf = "this is a test"; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int iResult; 
    int recvbuflen = DEFAULT_BUFLEN; 

    // Validate the parameters 
    if (argc != 2) { 
     printf("usage: %s server-name\n", argv[0]); 
     return 1; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return 1; 
    } 

    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    // Resolve the server address and port 
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return 1; 
    } 

    // Attempt to connect to an address until one succeeds 
    for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { 

     // Create a SOCKET for connecting to server 
     ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
      ptr->ai_protocol); 
     if (ConnectSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      WSACleanup(); 
      return 1; 
     } 

     // Connect to server. 
     iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 
     if (iResult == SOCKET_ERROR) { 
      closesocket(ConnectSocket); 
      ConnectSocket = INVALID_SOCKET; 
      continue; 
     } 
     break; 
    } 

    freeaddrinfo(result); 

    if (ConnectSocket == INVALID_SOCKET) { 
     printf("Unable to connect to server!\n"); 
     WSACleanup(); 
     return 1; 
    } 

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

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

    // shutdown the connection since no more data will be sent 
    iResult = shutdown(ConnectSocket, SD_SEND); 
    if (iResult == SOCKET_ERROR) { 
     printf("shutdown failed with error: %d\n", WSAGetLastError()); 
     closesocket(ConnectSocket); 
     WSACleanup(); 
     return 1; 
    } 

    // Receive until the peer closes the connection 
    do { 

     iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); 
     if (iResult > 0) 
      printf("Bytes received: %d\n", iResult); 
     else if (iResult == 0) 
      printf("Connection closed\n"); 
     else 
      printf("recv failed with error: %d\n", WSAGetLastError()); 

    } while (iResult > 0); 

    // cleanup 
    closesocket(ConnectSocket); 
    WSACleanup(); 

    return 0; 
} 

但問題是我不知道這段代碼的哪些部分是IPPort?正如你在我的c#應用程序中看到的,我配置了IPport。但是在C++代碼中我找不到任何變量來初始化IPPort

回答

1

你的代碼出現遍歷最初由線設置的可用端口的序列:

iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); 

&然後通過這裏

for (ptr = result; ptr != NULL; ptr = ptr->ai_next) 
循環

與企圖使在該行

iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); 

的IP &端口值的連接被存儲在該結構由addrinfo中結構的ai_addr字段指向。由ai_addr指向的結構依賴於協議 - 對於TCP,它是一個sockaddr_in結構,其中包含sin_port & sin_addr,它是IP地址的另一個4字節結構。請訪問以下鏈接:

https://msdn.microsoft.com/en-gb/library/windows/desktop/ms737530(v=vs.85).aspx https://msdn.microsoft.com/en-gb/library/windows/desktop/ms740496(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/ms738571(v=vs.85).aspx