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".
我正在做一个项目,我必须做一个程序 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".