gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:08:43 26 4
gpt4 key购买 nike

我是 C 编程的新手,我一直在尝试编写一个程序来向自身发送消息、接收消息并发回消息。我找到了一个 example一个客户端和服务器程序,基本上只是复制它,试图做一些改变。该程序不仅崩溃,而且输出“你的消息”。代码中没有任何地方是字符串“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;
}

最佳答案

“ur message”是“I got your message”的结尾。

您没有正确使用 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 初始化为您要写入的字符串,如果您将其声明为数组,您仍然可以这样做,但它会更简单自己写字符串。

关于C 程序在尝试使用套接字时输出奇怪的 "ur message",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com