2

I wrote a server program and a client program that communicate with sockets on linux ubuntu. The client program outputs Received: 艎��

This my server code:

/*** tcp_server.c ***/

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

int main() {
    int sock_fd, new_fd, bytes;
    struct sockaddr_in seraddr, cliaddr;
    char data[1024];
    socklen_t cli_addr_size;
    cli_addr_size = sizeof(cliaddr);

    sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&seraddr, 0, sizeof(seraddr));
    seraddr.sin_family = AF_INET;
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY); // INADDR_ANY : It received Network Interface that connected server defined interface, htonl :  
    seraddr.sin_port = htons(5050);
    bind(sock_fd, (struct sockaddr *)&seraddr, sizeof(seraddr));
    listen(sock_fd, 10);
    while (1) {
        new_fd = accept(sock_fd, (struct sockaddr *)&cliaddr, &cli_addr_size);
        bytes = recv(new_fd, data, 1024, 0);
        send(new_fd, data, bytes, 0);
        close(new_fd);
    }   

    close(sock_fd);
}

My client code is:

/*** tcp_client.c ***/

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

int main(int argc, char *argv[]) {
    int sock_fd, bytes;
    struct sockaddr_in ser_addr;
    char *snddata, rcvdata[1024];

    snddata = argv[2];
    sock_fd = socket(AF_INET, SOCK_STREAM, 0);

    memset(&ser_addr, 0,sizeof(ser_addr));
    ser_addr.sin_family = AF_INET;
    ser_addr.sin_addr.s_addr = inet_addr(argv[1]); // INADDR_ANY : It received Network Interface that connected server defined interface, htonl :  
    ser_addr.sin_port = htons(5050);
    connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr));
    send(sock_fd, snddata, strlen(snddata), 0);
    printf("Received: ");
    
    bytes = recv(sock_fd, rcvdata, 1024, 0);
    rcvdata[bytes] = '\0';
    printf("%s\n", rcvdata);

    close(sock_fd);
}

First I got an error for argument 3 of accept, then I changed

        new_fd = accept(sock_fd, (struct sockaddr *)&cliaddr, sizeof(cliaddr);

But It still produces this strange word.

chqrlie
  • 131,814
  • 10
  • 121
  • 189
김민철
  • 21
  • 1

1 Answers1

0

Try to change your send() and receive() functions so that you have full control over how much and which byte you send from the buffer (data[1024]) like in this thread : C socket: recv and send all data and also see Beej's Guide to Network Programming (http://beej.us/guide/bgnet/)

Also make sure that you initialize your data buffers:

data[1024] = "";
rcvdata[1024] = "";

or

 data[1024];
 data[0] = '\0';
 rcvdata[1024];
 rcvdata[0] = '\0';

, background is in this thread : Why I am getting this unusually symbols by printing char string

ralf htp
  • 9,149
  • 4
  • 22
  • 34