开发者

simple TCP client serve model in C : client not recieving

开发者 https://www.devze.com 2023-04-04 00:56 出处:网络
im making a simple TCP client-server in c and im trying to send a message from the client to the server, but im having some problems with it.

im making a simple TCP client-server in c and im trying to send a message from the client to the server, but im having some problems with it. The server does send the message (integer value > 0) but the client is unable to receive it (integer value > 0) here is the code: Client

#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdio.h>




int main()
{
    int s_id;
    char *msg = "hello";
    struct sockaddr_in serv_addr;
    s_id = socket (AF_INET, SOCK_STREAM, 0);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons (1156);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(s_id,(struct sockaddr *) &serv_addr, sizeof (struct sockaddr));
    int r = recv (s_id, (char *) msg, 9, 0);
    printf("%d \n", r );
    printf("%s \n", msg );

    return 0;
}

Server:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int main()
{
       int s_id;
       char *msg = "connected";
       struct sockaddr_in my_addr, remote_addr;
       s_id = socket (PF_INET,SOCK_STREAM,0);
       my_addr.sin_family = AF_INET;
       my_addr.sin_port = htons(1156);
       my_addr.sin_addr.s_addr  = inet_addr("127.0.0.1");

       bind(s_id,(struct sockaddr *) &my_addr, sizeof(struct sockaddr));
       listen (s_id,5);
       int size = sizeof (struct sockaddr_in);
       int new_sd = accept (s_id, (struct sockaddr *) &remote_addr, &size);
       int s= send(new_sd, (void *)msg, 9, 0);
       printf("%d \n", s );
       return 0;
}

The outputs i get (after first starting the server, and then the client) are server side: 9 client-side: -1 hello

I am using Ubuntu 11.04 and the gcc co开发者_StackOverflow中文版mpiler.

I hope someone out there can help. Thank you

Umar


char *msg = "hello";

This is a string literal. It's a constant, and you can't change it.

int r = recv (s_id, (char *) msg, 9, 0);

And there you're trying to write to it.

Change your declaration to:

char msg[20];
memset(msg, 0, sizeof(msg));

If you make that change, your code works as expected.

In C you're going to have to allocate and manage buffers - there's no free lunch :)

Also take note of the other answer from Nikolai N Fetissov - you really should be checking return codes from all the system calls.


You never check for errors after any of the system calls. All of socket(2), connect(2), etc. return -1 on failure, then you can print the error description with, say, perror(3) function. Each system call manual page lists possible errors.

Edit 0:

The real problem is probably what Brian points out - you are trying to receive data into read-only memory on the client. Does it die with a segfault?

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号