c - 在我的客户端服务器代码中,我可以使用通过 ifconfig 获得的 IP 地址远程登录到服务器?

标签 c sockets network-programming ubuntu-11.04

但是当我使用相同的 IP 地址通过客户端代码连接到服务器时,它会提供连接接收 connect() 失败:连接被拒绝。 我想通过 getsockname() 检查服务器 IP 地址。我收到的 IP 地址是

地址是“0.0.0.0:9000” 我用过这个 我是一名使用 Oracle Virtual box 环境 (Ubuntu ) 的大型程序员 请澄清我应该使用哪个 IP 地址传递给客户端以连接到服务器 用法 : 。/ 用法:./<“字符串”> 我基本上是想制作一个回显服务器。 提前致谢 。 客户代码: #include“实用.h”

int main(int argc, char *argv[]) {



if (argc < 3 || argc > 4) // Test for correct number of arguments
    DieWithUserMessage("Parameter(s)",
        "<Server Address> <Echo Word> [<Server Port>]");

  char *servIP = argv[1];     // First arg: server IP address (dotted quad)
  char *echoString = argv[2]; // Second arg: string to echo

  // Third arg (optional): server port (numeric).  7 is well-known echo port
  in_port_t servPort = (argc == 4) ? atoi(argv[3]) : 7;

  // Create a reliable, stream socket using TCP
  int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (sock < 0)
    DieWithSystemMessage("socket() failed");

  // Construct the server address structure
  struct sockaddr_in servAddr;            // Server address
  memset(&servAddr, 0, sizeof(servAddr)); // Zero out structure
  servAddr.sin_family = AF_INET;          // IPv4 address family
  // Convert address
  int rtnVal = inet_pton(AF_INET, servIP, &servAddr.sin_addr.s_addr);
  if (rtnVal == 0)
    DieWithUserMessage("inet_pton() failed", "invalid address string");
  else if (rtnVal < 0)
    DieWithSystemMessage("inet_pton() failed");
  servAddr.sin_port = htons(servPort);    // Server port
    printf ("Hello");

  // Establish the connection to the echo server
  if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
    DieWithSystemMessage("connect() failed");

  size_t echoStringLen = strlen(echoString); // Determine input length

  // Send the string to the server
  ssize_t numBytes = send(sock, echoString, echoStringLen, 0);
  if (numBytes < 0)
    DieWithSystemMessage("send() failed");
  else if (numBytes != echoStringLen)
    DieWithUserMessage("send()", "sent unexpected number of bytes");

  // Receive the same string back from the server
  unsigned int totalBytesRcvd = 0; // Count of total bytes received
  fputs("Received: ", stdout);     // Setup to print the echoed string
  while (totalBytesRcvd < echoStringLen) {
    char buffer[BUFSIZE]; // I/O buffer
    /* Receive up to the buffer size (minus 1 to leave space for
     a null terminator) bytes from the sender */
    numBytes = recv(sock, buffer, BUFSIZE - 1, 0);
    if (numBytes < 0)
      DieWithSystemMessage("recv() failed");
    else if (numBytes == 0)
      DieWithUserMessage("recv()", "connection closed prematurely");
    totalBytesRcvd += numBytes; // Keep tally of total bytes
    buffer[numBytes] = '\0';    // Terminate the string!
    fputs(buffer, stdout);      // Print the echo buffer
  }

  fputc('\n', stdout); // Print a final linefeed

  close(sock);
  exit(0);
}

Server Code :
#define  BUFSIZE  512
void HandleTCPClient(int clntSocket) {
  char buffer[BUFSIZE]; // Buffer for echo string

  // Receive message from client
  ssize_t numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0);
  if (numBytesRcvd < 0)
    printf("recv() failed");

  // Send received string and receive again until end of stream
  while (numBytesRcvd > 0) { // 0 indicates end of stream
    // Echo message back to client
    ssize_t numBytesSent = send(clntSocket, buffer, numBytesRcvd, 0);
    if (numBytesSent < 0)
      printf("send() failed");
    else if (numBytesSent != numBytesRcvd)
      printf("send()", "sent unexpected number of bytes");

    // See if there is more data to receive
    numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0);
    if (numBytesRcvd < 0)
      printf("recv() failed");
  }

  close(clntSocket); // Close client socket
}
static const int MAXPENDING = 5;
int main(int argc, char *argv[]) {

  if (argc != 2)
  {
    printf ("Parameters , <Server Port required >");
  }
  in_port_t servPort = atoi(argv[1]);
  int servSock; // Socket descriptor for server
  if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  {
    printf ( "Socket Failed ");
    exit (1);
  }
  struct sockaddr_in servAddr;                  // Local address
  memset(&servAddr, 0, sizeof(servAddr));       // Zero out structure
  servAddr.sin_family = AF_INET;                // IPv4 address family
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Any incoming interface
  servAddr.sin_port = htons(servPort);          // Local port

  // Bind to the local address
  if (bind(servSock, (struct sockaddr*) &servAddr, sizeof(servAddr)) < 0)
  {
    printf ("Bind Failed ");
    exit (1);
  }
  // Mark the socket so it will listen for incoming connections
  if (listen(servSock, MAXPENDING) < 0)
    printf("listen() failed");
   for (;;) { // Run forever
    struct sockaddr_in clntAddr; // Client address
    // Set length of client address structure (in-out parameter)
    socklen_t clntAddrLen = sizeof(clntAddr);

    // Wait for a client to connect
    int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);
    if (clntSock < 0)
      printf ("accept() failed");

    // clntSock is connected to a client!

    char clntName[INET_ADDRSTRLEN]; // String to contain client address
    if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName,
        sizeof(clntName)) != NULL)
      printf("Handling client %s/%d\n", clntName, ntohs(clntAddr.sin_port));
    else
      puts("Unable to get client address");

    HandleTCPClient(clntSock);
  }
  // NOT REACHED
}

Code is not mine I have Copied for Practice 

最佳答案

这应该有效:

服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

#define  BUFSIZE  512
void HandleTCPClient(int clntSocket) {
  char buffer[BUFSIZE]; // Buffer for echo string

  // Receive message from client
  ssize_t numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0);
  if (numBytesRcvd < 0)
    printf("recv() failed");

  // Send received string and receive again until end of stream
  while (numBytesRcvd > 0) { // 0 indicates end of stream
    // Echo message back to client
    ssize_t numBytesSent = send(clntSocket, buffer, numBytesRcvd, 0);
    if (numBytesSent < 0)
      printf("send() failed");
    else if (numBytesSent != numBytesRcvd)
      printf("send(), sent unexpected number of bytes");

    // See if there is more data to receive
    numBytesRcvd = recv(clntSocket, buffer, BUFSIZE, 0);
    if (numBytesRcvd < 0)
      printf("recv() failed");
  }

  close(clntSocket); // Close client socket
}
static const int MAXPENDING = 5;
int main(int argc, char *argv[]) {

  if (argc != 2)
  {
    printf ("Parameters , <Server Port required >");
  }
  in_port_t servPort = atoi(argv[1]);
  int servSock; // Socket descriptor for server
  if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  {
    printf ( "Socket Failed ");
    exit (1);
  }
  struct sockaddr_in servAddr;                  // Local address
  memset(&servAddr, 0, sizeof(servAddr));       // Zero out structure
  servAddr.sin_family = AF_INET;                // IPv4 address family
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // Any incoming interface
  servAddr.sin_port = htons(servPort);          // Local port

  // Bind to the local address
  if (bind(servSock, (struct sockaddr*) &servAddr, sizeof(servAddr)) < 0)
  {
    printf ("Bind Failed ");
    exit (1);
  }
  // Mark the socket so it will listen for incoming connections
  if (listen(servSock, MAXPENDING) < 0)
    printf("listen() failed");
   for (;;) { // Run forever
    struct sockaddr_in clntAddr; // Client address
    // Set length of client address structure (in-out parameter)
    socklen_t clntAddrLen = sizeof(clntAddr);

    // Wait for a client to connect
    int clntSock = accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);
    if (clntSock < 0)
      printf ("accept() failed");

    // clntSock is connected to a client!

    char clntName[INET_ADDRSTRLEN]; // String to contain client address
    if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName,
        sizeof(clntName)) != NULL)
      printf("Handling client %s/%d\n", clntName, ntohs(clntAddr.sin_port));
    else
      puts("Unable to get client address");

    HandleTCPClient(clntSock);
  }
  // NOT REACHED
}

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

#define  BUFSIZE  512

int main(int argc, char *argv[]) {

if (argc < 3 || argc > 4) // Test for correct number of arguments
{
    fprintf(stderr, "Parameter(s), <Server Address> <Echo Word> [<Server Port>]\n");
    exit(EXIT_FAILURE);
}

  char *servIP = argv[1];     // First arg: server IP address (dotted quad)
  char *echoString = argv[2]; // Second arg: string to echo

  // Third arg (optional): server port (numeric).  7 is well-known echo port
  in_port_t servPort = (argc == 4) ? atoi(argv[3]) : 7;

  // Create a reliable, stream socket using TCP
  int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (sock < 0)
  {
    fprintf(stderr, "socket() failed\n");
    exit(EXIT_FAILURE);
  }

  // Construct the server address structure
  struct sockaddr_in servAddr;            // Server address
  memset(&servAddr, 0, sizeof(servAddr)); // Zero out structure
  servAddr.sin_family = AF_INET;          // IPv4 address family
  // Convert address
  int rtnVal = inet_pton(AF_INET, servIP, &servAddr.sin_addr.s_addr);
  if (rtnVal == 0)
  {
    fprintf(stderr, "inet_pton() failed, invalid address string\n");
    exit(EXIT_FAILURE);
  }
  else if (rtnVal < 0)
  {
    fprintf(stderr, "inet_pton() failed\n");
    exit(EXIT_FAILURE);
  }
  servAddr.sin_port = htons(servPort);    // Server port
    printf ("Hello");

  // Establish the connection to the echo server
  if (connect(sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
    fprintf(stderr, "connect() failed\n");

  size_t echoStringLen = strlen(echoString); // Determine input length
  // Send the string to the server
  ssize_t numBytes = send(sock, echoString, echoStringLen, 0);
  if (numBytes < 0)
  {
    fprintf(stderr, "send() failed\n");
    exit(EXIT_FAILURE);
  }
  else if (numBytes != echoStringLen)
  {
    fprintf(stderr, "send(), sent unexpected number of bytes\n");
    exit(EXIT_FAILURE);
  }

  // Receive the same string back from the server
  unsigned int totalBytesRcvd = 0; // Count of total bytes received
  fputs("Received: ", stdout);     // Setup to print the echoed string
  while (totalBytesRcvd < echoStringLen) {
    char buffer[BUFSIZE]; // I/O buffer
    /* Receive up to the buffer size (minus 1 to leave space for
     a null terminator) bytes from the sender */
    numBytes = recv(sock, buffer, BUFSIZE - 1, 0);
    if (numBytes < 0)
    {
      fprintf(stderr, "recv() failed\n");
      exit(EXIT_FAILURE);
    }
    else if (numBytes == 0)
    {
      fprintf(stderr, "recv(), connection closed prematurely\n");
      exit(EXIT_FAILURE);
    }
    totalBytesRcvd += numBytes; // Keep tally of total bytes
    buffer[numBytes] = '\0';    // Terminate the string!
    fputs(buffer, stdout);      // Print the echo buffer
    }

  fputc('\n', stdout); // Print a final linefeed

  close(sock);
  exit(0);
}

你像这样测试(2个终端):

toc@UnixServer:~./client_error_socket 192.168.1.7 "HELLO" 4444
HelloReceived: HELLO

toc@UnixServer:~./server_error_socket 4444
Handling client 192.168.1.7/56963

使用您的 IP 地址而不是 (192.168.1.7)。

希望这有帮助。

问候。

关于c - 在我的客户端服务器代码中,我可以使用通过 ifconfig 获得的 IP 地址远程登录到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11754369/

相关文章:

c - 仅使用 1 个非阻塞套接字时执行 select() 是否有意义?

c - 截断缓冲区

python - 无法在Python中创建线程

c++ - 如何退出阻塞的 recv() 调用?

c - 某些调用后套接字不工作

c - C 编码中的按位运算

c - CodeBlock 中的结构大小错误

c - 监听两个不同端口的 TCP 服务器

c - 使用Wifi模块ESP8266发送UDP广播消息

c++ - SHDeleteKey 和 RegDeleteTree 有什么区别?