我正在开发一个项目,我必须在其中执行一个程序Client / Server,我必须测试连接,发送/接收文件并列出服务器上保存的所有文件。
我是第一步,我被要求手动输入端口号和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
中使用它?
在建立与服务器的连接后,我能够发送和接收消息,但我想显示跟踪(帧)及其大小(以字节为单位)等。 有什么想法吗?
谢谢
答案 0 :(得分:0)
对于IP变量,它更简单。您可以使用固定大小为16的char数组来避免动态内存分配,因为16个字节足以存储具有有效IPv4地址的字符串(例如" 255.255.255.255" - 3个点+ 12个数字+ 1个null符号终止字符串)。
阅读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);
"%15s"
中的字符串scanf
表示我们要读取空终止字符串s
,其长度最多应为15个字符(null中的+1不计入该数字)。
首先关于帧我虽然想要捕获单独的数据包。但是,现在看起来你只想要使用TCP套接字进行客户端 - 服务器通信,并使用一些关于活动的打印件。
让我们以客户为例。您已经连接了状态。接下来你应该准备数据缓冲区来发送。在发送之前,您可以打印"传送帧..."。
然后你应该准备超时。这是How to set socket timeout in C when making multiple connections?(答案https://stackoverflow.com/a/4182564/4023446)。您可以打印"激活超时1000毫秒"。
数据发送send()
。此函数返回已发送字节数。因此,如果该数字与您发送的数据数量相等,则可以打印"已发送"。
类似地,可以根据阶段描述服务器上的读取操作:连接,读取(也可以使用超时),接收:" TEST"。