2012-08-01 76 views
0

但是,当我使用相同的Ipaddress通过我的客户端代码连接到服务器时,它会使连接收到 connect()失败:连接被拒绝。 我希望通过检查getsockname()。我收到的ip地址是在我的客户端服务器代码中,我可以通过ifconfig通过Ipaddress执行telnet到服务器?

地址在服务器Ipaddress:显示“0.0.0.0:9000” 我用这个 我使用Oracle虚拟框环境(Ubuntu的) 一个biggner程序员请澄清我应该使用哪个ipaddress传递给客户端以便连接到服务器 用法:./ 用法:./ <“字符串”> 我基本上试图制作一个回显服务器。 在此先感谢。 客户端代码: 的#include “Practical.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 
+0

'0.0.0.0:9000'不是一个有效的IP地址 - 你能在服务器上显示你的ifconfig输出吗? – Konerak 2012-08-01 07:23:08

+0

在你的场景中,有太多的未知因素需要做出明智而简洁的回答;您需要通过基本的网络连接故障排除来确保您可以访问虚拟机,在服务器中显示执行绑定/接受的代码,然后编辑您的帖子以添加该信息 – tbert 2012-08-01 07:23:35

回答

1

这应该工作:

Server代码:

#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个终端):

[email protected]:~./client_error_socket 192.168.1.7 "HELLO" 4444 
HelloReceived: HELLO 

[email protected]:~./server_error_socket 4444 
Handling client 192.168.1.7/56963 

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

希望得到这个帮助。

问候。

+0

嗨,我正在使用Oracle Virtual box Ubuntu 。我在ifconfig后得到的Ipaddress希望我是对的。我必须在Ubuntu配置上做任何改变。 – Vivek 2012-08-02 05:16:15

+0

@Vivek:它不会改变任何东西,你必须使用你的IP地址(默认情况下VirtualBox给你一个私有IP地址,例如:192.168.xx或10.xxx或172.16.xx),所以检查命令的输出ifconfig和grub你的地址,你可以在这里找到一个ifconfig的例子(http://www.thegeekstuff.com/2009/03/ifconfig-7-examples-to-configure-network-interface/) – TOC 2012-08-02 08:50:23

相关问题