C程序尝试使用套接字时输出奇怪的“ ur message”

杰克

我是C编程的新手,我一直在尝试编写一种程序以向自身发送消息,接收消息并将其发回。我找到了一个客户端和服务器程序示例,基本上只是复制了它,试图进行一些更改。该程序不仅崩溃,而且会输出“ ur message”。代码中没有字符串“ ur message”,那么每次输出该字符串的可能性如何?

对于粘贴大量代码,我深表歉意,我只是不知道问题出在哪里,而且我也不想遗漏任何可能相关的内容。任何帮助将不胜感激,谢谢。

#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;
}
安迪·施威格(Andy Schweig)

“您的消息”是“我收到您的消息”的结尾。

您没有使用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要编写的字符串,如果您将其声明为数组,仍可以执行此操作,但是只编写字符串本身会更简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章