2016-12-03 81 views
0

我是C编程的新手,我一直在尝试编写一个程序向自己发送消息,接收消息并发回消息。我发现一个客户端和服务器程序的example,基本上只是复制它,试图做一些改变。该程序不仅崩溃,而且输出“你的信息”。代码中没有任何地方是字符串“你的信息”,那么它怎么可能每次都输出呢?C程序在尝试使用套接字时输出奇怪的“ur消息”

我很抱歉粘贴大量的代码,我只是不知道问题出在哪里,我不想留下任何可能相关的东西。任何帮助将不胜感激,谢谢。

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

#include <pthread.h> 

char *write_buffer_to_port(char *host, int portno); 
char *listen_on_port(int portno); 
void* listen_thread(void *arg); 
char *buffer_a; 
char *buffer_b; 

int main(int argc, char *argv[]) { 
    buffer_a = "test"; 
    buffer_b = ""; 
    pthread_t tid[2]; 
    pthread_create(&(tid[1]), NULL, &listen_thread, NULL); 
    printf("%s",write_buffer_to_port("localhost", 5737)); 
} 

char *write_buffer_to_port(char *host, int portno) { 
    int sockfd, n; 

    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) exit(1); 

    server = gethostbyname(host); 
    if (server == NULL) exit(2); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
    (char *)&serv_addr.sin_addr.s_addr, 
    server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) exit(3); 
    n = write(sockfd, buffer_a, strlen(buffer_a)); 
    if (n < 0) exit(4); 

    n = read(sockfd, &buffer_a, 255); 
    if (n < 0) exit(5); 
    close(sockfd); 
    return (char *)buffer_a; 
} 

char *listen_on_port(int portno) { 
    int sockfd, newsockfd, clilen; 

    struct sockaddr_in serv_addr, cli_addr; 
    int n; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) exit(1); 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 
    if (bind(sockfd, (struct sockaddr *) &serv_addr, 
         sizeof(serv_addr)) < 0) exit(2); 
    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen); 
    if (newsockfd < 0) exit(3); 
    //bzero(buffer_a,256); 
    n = read(newsockfd,&buffer_b,255); 
    if (n < 0) exit(4); 
    //printf("Here is the message: %s\n",(char *)&buffer_b); 
    n = write(newsockfd,"I got your message",18); 
    if (n < 0) exit(5); 
    return (char *)&buffer_b; 
} 

void* listen_thread(void *arg) { 
    printf("rcvd: %s\n",listen_on_port(5737)); 
    return NULL; 
} 
+0

我总是想知道为什么你们的新手们开始使用这种复杂的东西(多线程客户端/服务器)。如果(试图成为?)成为一名机械工程师,你不会从火箭开始,即使搭乘飞机,但也许是用自行车或出发卡......,不是吗? – alk

+0

@alk诚然,但我觉得很难被激励去建立我不想要的东西。为什么不在一个有趣的项目上工作,并采取必要的切线,在途中学习你需要的东西?这可能需要很长时间才能建立,但是一天结束时,你会得到一个很酷的项目和一些相当不错的技能。而且我并不是新手编程,只是C. – Jake

回答

2

“你的信息”是“我收到你的信息”的结尾。

您没有正确使用buffer_abuffer_b。你宣布他们的方式,他们是指向char。当您执行read(fd, &buffer_b, 255)时,您正在读取指针buffer_b占用的内存,而不是读入某个缓冲区。

如果要读入缓冲区,则需要将缓冲区声明为有空间供您读入的对象,或者将其声明为指针并调用malloc为其分配内存。如果你声明缓冲区为char buffer_a[256],你将能够读入它们。该声明保留256个字节,并且buffer_a是该存储器的开始地址。然后您可以执行read(fd, buffer_a, sizeof(buffer_a))来读取缓冲区。

我看到你正在初始化buffer_a为一个你要写的字符串,如果你将它声明为一个数组,那么你仍然可以这样做,但是只写这个字符串本身会更简单。

+0

好的。原始代码是缓冲[256],但我改变了它,因为我无法打印或返回它。我如何有一个函数返回一个char [256]? – Jake

+1

该函数将返回'char *'('char'数组的名称就像一个常量'char *')。 –

0

您正在使用未分配的缓冲区, char * buffer_a; char * buffer_b; 所以要解决它要么分配(malloc)它在主或声明他们作为数组。