Socket编程中如何手动输入IP地址以及如何打印痕迹?

How to enter an IP address manually in Socket Programming and how to print traces?

我正在做一个项目,我必须做一个程序 Client/Server 我必须测试连接,send/receive 文件并列出服务器上保存的所有文件。

我在第一步,要求我手动输入端口号和IP地址,我在IP地址声明上被屏蔽了..

有我的代码

void connection(){  
    int port;
    int sockfd,connfd;
    struct sockaddr_in servaddr,cli;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
    printf("socket creation failed...\n");
    exit(0);
}
else
    printf("Socket successfully created..\n");
    printf("Enter Port Number \n");
    scanf("%d",&port);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    servaddr.sin_port=htons(port);
if(connect(sockfd,(SA *)&servaddr,sizeof(servaddr))!=0)
{
    printf("connection with the server failed...\n");
    printf("Program Closed\n");
    exit(0);
}
else
    printf("connected to the server..\n");
    printf("listening from Server\n");
    func(sockfd);
    close(sockfd);}

现在如果我想声明一个变量并将我的 IP“127.0.0.1”放入其中并在此行中使用它 servaddr.sin_addr.s_addr=inet_addr ?

与服务器建立连接后,我可以发送和接收消息,但我想显示跟踪(帧)及其大小(以字节为单位)等。 有什么想法吗?

谢谢

IP变量比较简单的部分。您可以使用固定大小为 16 的 char 数组来避免动态内存分配,因为 16 个字节足以存储具有有效 IPv4 地址的字符串(例如“255.255.255.255”- 3 个点 + 12 个数字 + 1 个空符号终止字符串)。

读取IP的代码:

char ip[16];
scanf("%15s", ip);
/* if needed it is possible to write some function for validation of
 * enetered string to check that it is valid IP address string: 4 decimal
 * numbers in range 0...255 separated by dots */
/* ... */
servaddr.sin_addr.s_addr = inet_addr(ip);

scanf中的字符串"%15s"表示我们要读取一个以null结尾的字符串s,它的长度最多为15个字符(+1为null不计入那个数字)。

关于帧,起初我认为您想要捕获单独的数据包。但是,现在看来您只想使用 TCP 套接字进行常规的客户端-服务器通信,并打印一些有关活动的信息。

让我们以客户为例。你已经有连接状态。接下来您应该准备要发送的数据缓冲区。在发送之前你可以打印 "Transmission of frame...".

那你就要做好超时的准备了。就是这里 How to set socket timeout in C when making multiple connections? (the answer )。你可以打印 "Activation of timeout 1000ms".

数据发送send()。此函数returns 发送的字节数。因此,如果该数字等于您发送的数据数,则可以打印 "Sent".

同样可以按照阶段用短语来描述服务器上的读操作:connected,reading(也可能超时),received:"TEST".