I';我不熟悉C语言中的网络,我需要从命令行参数向服务器发送一个字符串(字符数组)
但是,当我尝试发送命令行参数时,它被发送到服务器但不显示,另一方面,当我将硬编码字符串复制到msgBuffer并发送它时,它成功地显示在服务器上。(参见客户机代码示例) 这是我的服务器代码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
#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值,以确保它们是您认为的值。即使这样做,硬编码参数和命令行参数的情况仍然相同。