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
I';我不熟悉C语言中的网络,我需要从命令行参数向服务器发送一个字符串(字符数组)_C_Sockets_Networking_Command Line Arguments - Fatal编程技术网

I';我不熟悉C语言中的网络,我需要从命令行参数向服务器发送一个字符串(字符数组)

I';我不熟悉C语言中的网络,我需要从命令行参数向服务器发送一个字符串(字符数组),c,sockets,networking,command-line-arguments,C,Sockets,Networking,Command Line Arguments,但是,当我尝试发送命令行参数时,它被发送到服务器但不显示,另一方面,当我将硬编码字符串复制到msgBuffer并发送它时,它成功地显示在服务器上。(参见客户机代码示例) 这是我的服务器代码 #include <stdio.h> #include <sys/socket.h> #include <stdlib.h> #include <netinet/in.h> #include <unistd.h> #include <strin

但是,当我尝试发送命令行参数时,它被发送到服务器但不显示,另一方面,当我将硬编码字符串复制到msgBuffer并发送它时,它成功地显示在服务器上。(参见客户机代码示例)

这是我的服务器代码

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

int main(int argc, char const *argv[])
{
    int socket_id = 0, accept_socket = 0, n=1;
    int port_no;
    char msgBuff[256];
    char msgRecv[1024];
    struct sockaddr_in server_address;

    strcpy(msgBuff,"Hello World\n");

    socket_id = socket(AF_INET,SOCK_STREAM,0);

    if(socket_id < 0){
        printf("Error retrieving socket.");
        exit(0);
    }

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = INADDR_ANY;
    server_address.sin_port = atoi(argv[1]);

    if(bind(socket_id, (struct sockaddr*)&server_address, sizeof(server_address)) < 0){

        printf("Error binding socket.");
        exit(0);
    }


    if(listen(socket_id, 5) < 0){
        printf("Error listening to socket.");
    }

    while(1){
        accept_socket = accept(socket_id, NULL, NULL);
        n = read(accept_socket, msgRecv, 1024);
        msgRecv[n] = 0;

        if(n < 0){
            printf("error reading message");
    }

    printf("%s",msgRecv);
        write(accept_socket, msgBuff, strlen(msgBuff)); 
        close(accept_socket);       
    }
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char const*argv[]
{
int socket_id=0,accept_socket=0,n=1;
国际港口号;
char-msgBuff[256];
char msgRecv[1024];
服务器地址中的结构sockaddr\u;
strcpy(msgBuff,“你好,世界”\n);
socket\u id=socket(AF\u INET,SOCK\u STREAM,0);
if(插座id<0){
printf(“检索套接字时出错”);
出口(0);
}
服务器地址.sin\u family=AF\u INET;
server_address.sin_addr.s_addr=INADDR\u ANY;
server_address.sin_port=atoi(argv[1]);
if(绑定(套接字id,(结构sockaddr*)和服务器地址,sizeof(服务器地址))<0{
printf(“错误绑定套接字”);
出口(0);
}
如果(监听(插座id,5)<0){
printf(“侦听套接字时出错”);
}
而(1){
accept\u socket=accept(socket\u id,NULL,NULL);
n=读取(接受_套接字,msgRecv,1024);
msgRecv[n]=0;
if(n<0){
printf(“错误读取消息”);
}
printf(“%s”,msgRecv);
写入(接受_套接字、msgBuff、strlen(msgBuff));
关闭(接受_插座);
}
返回0;
}
要运行服务器:./服务器端口号

要运行客户端:./client 127.0.0.1端口号消息要发送

这是客户端代码

#include <stdio.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main(int argc, char *argv[]){

int socket_id = 0, connect_status, n,len;
struct sockaddr_in serverDetail;
char msgRecv[512];
char msgBuff[2048];

strcpy(msgBuff, "xyz.com");               //THIS WORKS
    strcpy(msgBuff, argv[3]);                 //THIS DOESNT

socket_id = socket(AF_INET, SOCK_STREAM, 0);

if(socket_id < 0){
    printf("Error retrieving socket");
    exit(0);
}

serverDetail.sin_family = AF_INET;
serverDetail.sin_port = atoi(argv[2]);
serverDetail.sin_addr.s_addr = inet_addr(argv[1]);

connect_status = connect(socket_id, (struct sockaddr*)&serverDetail, sizeof(serverDetail));

if(connect_status < 0 ){
    printf("Error connecting to server");
    exit(0);
}
write(socket_id , argv[3], 1024);

n = read(socket_id, msgRecv, sizeof(msgRecv));

if(n < 0){
    printf("Error in message reading");
    exit(0);
}

printf("%s",msgRecv);

return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
int socket_id=0,连接状态,n,len;
serverDetail中的结构sockaddr_;
char-msgRecv[512];
char-msgBuff[2048];
strcpy(msgBuff,“xyz.com”);//这很有效
strcpy(msgBuff,argv[3]);//这不是
socket\u id=socket(AF\u INET,SOCK\u STREAM,0);
if(插座id<0){
printf(“检索套接字时出错”);
出口(0);
}
serverDetail.sin_family=AF_INET;
serverDetail.sin_port=atoi(argv[2]);
serverDetail.sin_addr.s_addr=inet_addr(argv[1]);
connect_status=connect(socket_id,(struct sockaddr*)&serverDetail,sizeof(serverDetail));
如果(连接状态<0){
printf(“连接到服务器时出错”);
出口(0);
}
写入(socket_id,argv[3],1024);
n=读取(套接字id、msgRecv、sizeof(msgRecv));
if(n<0){
printf(“消息读取错误”);
出口(0);
}
printf(“%s”,msgRecv);
返回0;
}

请记住,
argv[3]
是一个字符串,即它是以
'\0'
字符结尾的字符序列。如果您无条件地发送
1024
字节,则很可能会发送太多,导致超出字符串边界时出现未定义的行为

我建议您改为使用
strlen
发送字符串中的确切字符数


您似乎也不会在收到的所有情况下终止所有字符串。

客户端中唯一的写入操作是
write(socket\u id,argv[3],1024)
,但我认为您应该编写
msgBuff
。您可能还想打印出
argc
和所有
argv
值,以确保它们是您认为的值。我已经尝试过了,但它不起作用。如果我只是在msgBuff中复制一个硬编码的字符串,它就可以正常工作。但是,如果我将argv[3]传递给strcpy(),它将不起作用。您可能还希望打印argc和所有argv值,以确保它们是您认为的值。即使这样做,硬编码参数和命令行参数的情况仍然相同。