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-socket写程序中缓冲区的发送_C_Sockets_Posix_System Calls - Fatal编程技术网

c-socket写程序中缓冲区的发送

c-socket写程序中缓冲区的发送,c,sockets,posix,system-calls,C,Sockets,Posix,System Calls,我正在使用fork()在C中创建一个TCP聊天室。每个客户端消息都应该在缓冲区中使用用户名和消息到达服务器,因此我使用strcpy(buffer,name)和strcat(buffer,“:”)组合缓冲区和名称。之后我用 n = write (sockfd, buffer, strlen(buffer)) 将缓冲区发送到服务器。就在这里,奇怪的事情发生了,我的服务器什么也没显示,但之后当我使用 n = read(sockfd, buffer, 255); printf("%s", buffer

我正在使用
fork()
在C中创建一个TCP聊天室。每个客户端消息都应该在缓冲区中使用用户名和消息到达服务器,因此我使用
strcpy(buffer,name)
strcat(buffer,“:”)
组合缓冲区和名称。之后我用

n = write (sockfd, buffer, strlen(buffer))
将缓冲区发送到服务器。就在这里,奇怪的事情发生了,我的服务器什么也没显示,但之后当我使用

n = read(sockfd, buffer, 255);
printf("%s", buffer);
字符串已正确传输。这是我的服务器代码:

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

int main(){
    int port;
    int i = 1;
    printf("Enter port ->");
    scanf("%d", &port);

    int sockfd, newsockfd, n;
    char buffer[255];
    struct sockaddr_in6 serv_addr, cli_addr;
    int ret, flag;

    sockfd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 
    if (sockfd < 0){
        printf("Error opening socket\n");
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    flag = 1;
    ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
    if (ret < 0){
        printf("Set sock opt errror\n");
    }
    serv_addr.sin6_family = AF_INET6;
    serv_addr.sin6_addr = in6addr_any;
    serv_addr.sin6_port = htons(port);

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){
        printf("Error binding\n");
    }

    listen(sockfd, 5);
    int clilen = sizeof(cli_addr);
    int pid;

    while(1){
        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0){
            printf("Error on accept\n");
        }
        printf("New connection\n");
        pid = fork();
        if (pid < 0){
            printf("Error on pid\n");
        }
        if (pid == 0){
            close(sockfd);
            while(1){
                bzero(buffer, 255);
                n = read(newsockfd, buffer, 255);
                if (n < 0){
                    printf("Error on reading\n");
                }
                printf("%s", buffer);
                n = write(newsockfd, buffer, strlen(buffer));
                if (n < 0){
                    printf("Error on writing\n");
                }
            }
        } 
    }
    close(newsockfd);
    return 0;
}
服务器工作正常,但我需要客户端用户名

我试着测试strlen(name)和
缓冲区
,结果一切正常。我试图手动将名称转换为缓冲区,如下所示:

 for (int i = 0; i < strlen(name); i++){
        buffer[i] = name[i];
 }
for(int i=0;i

但是,如果这是唯一的方法,我应该如何将缓冲区推到正确的输入名称,而不丢失消息信息?

您的代码有很多错误:)

首先,
scanf
将指针作为第一个参数,因此当您想将其用于字符串时,请执行以下操作:

char ip[10];
...
scanf("%s", ip);//THIS IS CORRECT
scanf(“%s”和&ip)

在服务器上,编译器正在抱怨
clilen
的类型<当您将该变量声明为简单的
int
时,code>accept
需要一个
sockelen\u t
(或等效的
unsigned int


主要问题 它是下面的。在客户端中,您执行了strcpy(缓冲区、名称)
从缓冲区的开始复制
name
,但缓冲区的开始实际上包含您的数据。您应该像在下一行中一样,使用strcat执行以下操作:

    bzero(buffer, 255);
    fgets(buffer, 255, stdin);
    strcat(buffer, name);
    strcat(buffer, ": ");

进一步的一般性意见
还要注意另一件事:避免将系统调用函数
read
write
getchar
与库函数混用,例如
fread
fwrite
fgets
。由于
fgets
读取的字节数可能比预期的要多,因此我对这一点产生了不满。在您的情况下应该可以,因为您将它们用于不同的目的。

我不太明白这应该如何工作。将消息读入缓冲区:
fgets(缓冲区,255,标准输入)
然后直接覆盖它,丢弃前面的字符串:
strcpy(buffer,name)。为什么?这个问题很不清楚。你有多少客户?是谁派来的?谁在接电话?服务器正在接收或只是没有打印?但在那之后,当我使用
n=read(sockfd,buffer,255);printf(“%s”,缓冲区)信息很好谁在打电话?为什么客户端不能向服务器发送包含名称和消息的完整缓冲区?信息不是很好吗?当我只发送使用fgets(buffer,255,stdin)获取的缓冲区时,
fgets
接收数据,不发送任何数据。@Ctx
fgets
获取消息,然后我尝试将其与用户名组合。@FrancescoBoi因此假设我们有一个客户端。他输入端口、ip和名称。然后他将一条消息写入缓冲区,服务器应该打印出这条消息。如果我发送纯缓冲区,一切正常,但在
strcpy
strcat
之后,服务器不打印任何内容,但客户端控制台打印正常。发送缓冲区的客户端打印正常吗?如果是这样的话,我想这应该是很明显的。如果您指定您的输入,我将尝试。感谢您的出色工作:)
char ip[10];
...
scanf("%s", ip);//THIS IS CORRECT
    bzero(buffer, 255);
    fgets(buffer, 255, stdin);
    strcat(buffer, name);
    strcat(buffer, ": ");