如何在套接字编程中手动输入IP地址以及如何打印迹线?

时间:2015-09-30 20:54:19

标签: c sockets server client client-server

我正在开发一个项目,我必须在其中执行一个程序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中使用它?

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

谢谢

1 个答案:

答案 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"。