C-socketecho程序
我试图制作一个程序,它从命令行中获取一个字符串,并在命令行参数中传递,将其发送到服务器,然后将其发送回客户端并在屏幕上显示。从recvfrom()函数中的print语句可以看出,现在它在服务器端冻结了。有人知道为什么它没有回响吗?对于命令行参数,服务器只获取端口号,客户端获取服务器名称、端口号和要回显的字符串。下面是我的代码: 头文件:C-socketecho程序,c,sockets,C,Sockets,我试图制作一个程序,它从命令行中获取一个字符串,并在命令行参数中传递,将其发送到服务器,然后将其发送回客户端并在屏幕上显示。从recvfrom()函数中的print语句可以看出,现在它在服务器端冻结了。有人知道为什么它没有回响吗?对于命令行参数,服务器只获取端口号,客户端获取服务器名称、端口号和要回显的字符串。下面是我的代码: 头文件: #include <stdio.h> #include <stdlib.h> #include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
服务器c:
#include "headerFiles.h"
int main(int argc, char* argv[])
{
int s;
int len;
char buffer[256];
struct sockaddr_in servAddr;
struct sockaddr_in clntAddr;
int clntAddrLen;
int serverPort;
// Build local (server) socket address
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(serverPort);
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// Create socket
if((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Error: socket failed!");
exit(1);
}
// Bind socket to local address and port
if((bind(s, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0))
{
perror("Error: bind failed!");
exit(1);
}
for(;;) // Runs forever
{
// Receive String
printf("In infinite loop.\n");
len = recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr*)&clntAddr, &clntAddrLen);
printf("Received something\n");
// Send String
sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr));
printf("Sent something\n");
}
}
#包括“headerFiles.h”
int main(int argc,char*argv[])
{
int-s;
内伦;
字符缓冲区[256];
servAddr中的结构sockaddr_;
clntAddr中的结构sockaddr_;
int CLNTADDREN;
int服务器端口;
//生成本地(服务器)套接字地址
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(服务器端口);
servAddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
//创建套接字
如果((s=插座(PF_INET,SOCK_DGRAM,0))<0)
{
perror(“错误:套接字失败!”);
出口(1);
}
//将套接字绑定到本地地址和端口
if((bind(s,(struct sockaddr*)&servAddr,sizeof(servAddr))<0))
{
perror(“错误:绑定失败!”);
出口(1);
}
因为(;)//永远运行
{
//接收字符串
printf(“在无限循环中。\n”);
len=recvfrom(s,buffer,sizeof(buffer),0,(struct sockaddr*)和clntAddr,&clntAddrLen);
printf(“收到某物”\n);
//发送字符串
sendto(s,buffer,len,0,(struct sockaddr*)和clntAddr,sizeof(clntAddr));
printf(“发送了某物”\n);
}
}
客户c:
#include "headerFiles.h"
int main (int argc, char* argv[]) // Three arguments to be checked later
{
int s; // Socket descriptor
int len; // Length of string to be echoed
char* servName; // Server name
int servPort; // Server port
char* string; // String to be echoed
char buffer[256+1]; // Data buffer
struct sockaddr_in servAddr; // Server socket address
// Check and set program arguments
if(argc != 4)
{
printf("Error: three arguments are needed!\n");
exit(1);
}
servName = argv[1];
servPort = atoi(argv[2]);
string = argv[3];
// Build server socket address
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
inet_pton(AF_INET, servName, &servAddr.sin_addr);
servAddr.sin_port = htons(servPort);
// Create socket
if((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Error: Socket failed!");
exit(1);
}
// Send echo string
len = sendto(s, string, strlen(string), 0, &servAddr, sizeof(servAddr));
printf("Past sendto\n");
// Receive echo string
recvfrom(s, buffer, len, 0, NULL, NULL);
//Print and verify echoed string
buffer[len] = '\0';
printf("Echo string received: ");
fputs(buffer, stdout);
printf("\n");
// Close the socket
close(s);
// Stop the program
exit(0);
}
#包括“headerFiles.h”
int main(int argc,char*argv[])//三个参数稍后检查
{
int s;//套接字描述符
int len;//要回显的字符串的长度
char*servName;//服务器名称
int servPort;//服务器端口
char*string;//要回显的字符串
字符缓冲区[256+1];//数据缓冲区
servAddr中的struct sockaddr\u;//服务器套接字地址
//检查并设置程序参数
如果(argc!=4)
{
printf(“错误:需要三个参数!\n”);
出口(1);
}
servName=argv[1];
servPort=atoi(argv[2]);
string=argv[3];
//生成服务器套接字地址
memset(&servAddr,0,sizeof(servAddr));
servAddr.sin_family=AF_INET;
inet\u pton(AF\u inet、servName和servAddr.sin\u addr);
servAddr.sin_port=htons(servPort);
//创建套接字
如果((s=插座(PF_INET,SOCK_DGRAM,0))<0)
{
perror(“错误:套接字失败!”);
出口(1);
}
//发送回显字符串
len=sendto(s,string,strlen(string),0,&servAddr,sizeof(servAddr));
printf(“过去发送到\n”);
//接收回显字符串
recvfrom(s,buffer,len,0,NULL,NULL);
//打印并验证回显字符串
缓冲区[len]='\0';
printf(“接收到回音字符串:”);
FPUT(缓冲区、标准输出);
printf(“\n”);
//合上插座
关闭(s);;
//停止节目
出口(0);
}
当传递到htons
时,server.cserverPort
中的未初始化。这很有效!真不敢相信我错过了。。。非常感谢你!虽然不会直接导致问题,但请注意传递给recvfrom
的addrlen
(最后一个参数)是一个值结果参数。也就是说,在将其传递给recvfrom
之前,需要将clntAddrLen
设置为sizeof servAddr
。如果recv()
返回的len
为零,则应关闭套接字并停止读取,如果为-1,则应打印错误,关闭套接字并停止读取。