Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序输出奇怪的“;“你的信息”;在尝试使用套接字时_C_Sockets_Network Programming - Fatal编程技术网

C程序输出奇怪的“;“你的信息”;在尝试使用套接字时

C程序输出奇怪的“;“你的信息”;在尝试使用套接字时,c,sockets,network-programming,C,Sockets,Network Programming,我是C语言编程新手,我一直在尝试编写一个程序,向自己发送消息,接收消息,然后发送回消息。我找到了一个客户端和服务器程序的副本,基本上只是复制了它,试图做一些更改。程序不仅崩溃,而且输出“ur message”。代码中没有字符串“ur message”,那么它怎么可能每次都输出这个呢 我很抱歉粘贴了大量代码,我只是不知道问题出在哪里,我不想遗漏任何可能相关的内容。任何帮助都将不胜感激,谢谢 #include <stdlib.h> #include <stdio.h> #in

我是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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
char*将缓冲区写入端口(char*主机,int端口号);
字符*监听端口(int端口号);
void*listen\u线程(void*arg);
字符*缓冲区a;
字符*缓冲区b;
int main(int argc,char*argv[]){
缓冲区a=“测试”;
缓冲区_b=“”;
pthread_t tid[2];
pthread_create(&(tid[1]),NULL,&listen_thread,NULL);
printf(“%s”,将缓冲区写入端口(“localhost”,5737));
}
char*将缓冲区写入端口(char*主机,int端口号){
int-sockfd,n;
服务地址中的结构sockaddr\u;
结构主机*服务器;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
如果(sockfd<0)退出(1);
服务器=gethostbyname(主机);
如果(服务器==NULL)退出(2);
bzero((char*)&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
b复制((字符*)服务器->h_地址,
(char*)和serv_addr.sin_addr.s_addr,
服务器->h_长度);
serv_addr.sin_port=htons(端口号);
如果(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)退出(3);
n=写入(sockfd,buffer_a,strlen(buffer_a));
如果(n<0)退出(4);
n=读取(sockfd和缓冲区a,255);
如果(n<0)退出(5);
关闭(sockfd);
返回(字符*)缓冲区;
}
char*在端口上侦听(int端口号){
int sockfd、newsockfd、clilen;
服务地址中的结构sockaddr\u,cli\u addr;
int n;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
如果(sockfd<0)退出(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(端口号);
如果(绑定(sockfd,(结构sockaddr*)和服务地址,
sizeof(serv_addr))<0)退出(2);
听(sockfd,5);
clilen=sizeof(cli_addr);
newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
如果(newsockfd<0)退出(3);
//bzero(缓冲器a,256);
n=读取(newsockfd和buffer_b,255);
如果(n<0)退出(4);
//printf(“这是消息:%s\n”,(char*)&buffer_b);
n=写(newsockfd,“我收到你的消息”,18);
如果(n<0)退出(5);
返回(字符*)&缓冲区;
}
void*listen\u线程(void*arg){
printf(“rcvd:%s\n”,监听端口(5737));
返回NULL;
}

您正在使用未分配的缓冲区, 字符*缓冲区a;字符*缓冲区b;
所以要修复它,可以在main中分配(malloc)它,或者将它们声明为数组

您正在使用未分配的缓冲区, 字符*缓冲区a;字符*缓冲区b; 所以要修复它,可以在main中分配(malloc)它,或者将它们声明为数组

“你的留言”是“我收到你的留言”的结尾

您没有正确使用
buffer\u a
buffer\u b
。按照您声明它们的方式,它们是指向
char
的指针。当您执行
read(fd,&buffer\u b,255)
时,您读取的是指针
buffer\u b
占用的内存,而不是某个缓冲区

如果要读入缓冲区,则需要将缓冲区声明为具有一定读入空间的对象,或者将其声明为指针并调用
malloc
为其分配内存。如果将缓冲区声明为[256]字符缓冲区,则可以读入它们。该声明保留256字节,而
buffer\u a
是该内存开始的地址。然后您可以执行
read(fd,buffer\u a,sizeof(buffer\u a))
来读取缓冲区

我看到您正在将
buffer\u a
初始化为要写入的字符串,如果将其声明为数组,您仍然可以这样做,但只需编写字符串本身就更简单了。

“ur message”是“我收到了您的消息”的结尾

您没有正确使用
buffer\u a
buffer\u b
。按照您声明它们的方式,它们是指向
char
的指针。当您执行
read(fd,&buffer\u b,255)
时,您读取的是指针
buffer\u b
占用的内存,而不是某个缓冲区

如果要读入缓冲区,则需要将缓冲区声明为具有一定读入空间的对象,或者将其声明为指针并调用
malloc
为其分配内存。如果将缓冲区声明为[256]字符缓冲区,则可以读入它们。该声明保留256字节,而
buffer\u a
是该内存开始的地址。然后您可以执行
read(fd,buffer\u a,sizeof(buffer\u a))
来读取缓冲区


我看到您正在将
buffer\u a
初始化为要编写的字符串,如果将其声明为数组,您仍然可以这样做,但只编写字符串本身会更简单。

啊,好的。原始代码是缓冲区[256],但我更改了它,因为我无法打印或返回它。如何让函数返回字符[256]?函数将返回
char*
(char数组的名称的行为类似于常量
char*
)。啊,好的。原始代码是缓冲区[256],但我更改了它,因为我无法打印或返回它。如何让函数返回字符[256]?函数将返回
char*
(字符数组的名称的行为类似于常量
c