【问题标题】:send working only once in the loop发送在循环中只工作一次
【发布时间】:2017-01-31 09:17:17
【问题描述】:

您好,我正在尝试处理 tcp 连接 我从客户端获取文件名并将其发送到服务器。服务器检查文件是否存在,否则它会发送适当的消息。 如果文件退出,则将数据发送到客户端 我只收到一次文件内容。

服务器程序

#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>

int main()
{
int s,b,opt,port,ns,len,recb,sntd;
char server_addr[100],*gets_func;
struct sockaddr_in server,client;
char buff[50];
printf("Enter the port number ");
scanf("%d",&port);

// The socket is now being created
s=socket(AF_INET,SOCK_STREAM,0);
if(s==-1)
{
    perror("SOCKET NOT CREATED \n");
    close(s);
    exit(0);
}
printf("SOCKET SUCCESSFULL ");
printf("\n Do you wish to input address \n 1.YES 2.NO : ");
scanf("%d",&opt);

if(opt==1)
{

    printf("Input the address of ther server :");
    scanf("%s",server_addr);
    printf("%s",server_addr);
    server.sin_addr.s_addr=inet_addr(server_addr);  
}
else
{
    server.sin_addr.s_addr=inet_addr("127.0.0.3");

}
server.sin_family=AF_INET;
server.sin_port=htons(port);
// Bind the server to the given address

b=bind(s,(struct sockaddr*)&server,sizeof(server));
if(b==-1)
{
    perror("\nBind not successfull");
    exit(0);    
}
printf("\nBIND SUCCESSFULL ");
b=listen(s,1);
if(b==-1)
{   
    perror("Error listening :");
    exit(0);
}
printf("\n Socket listening");
len=sizeof(client);
ns=accept(s,(struct sockaddr*)&client,&len);
if(ns==-1)
{
    close(s);
    exit(0);
}
printf("\nSocket accepted");
while(1)
{

    recb=recv(ns,buff,sizeof(buff),0);
    if(recb==-1)
    {
        perror("\nerror receving message : ");
        exit(0);
    }

    if(strcmp(buff,"exit")==0)
        break;
    printf("\nThe File Path is %s ", buff);



    // Accessing the file
    char contents[1000],ch;

    FILE *fp;
    int i=0;
    if(access(buff,F_OK)!=-1)
    {
        fp=fopen(buff,"r");
        printf("\n");
        while((ch=fgetc(fp))!=EOF)
        {
            //printf("%c - %d \n",ch,acii);
            contents[i]=ch;
            i++;
        }
        fclose(fp);
        contents[i]='\0';
        puts(contents);

    }
    else
    {
        char temp[]="FILE DOES'NT EXITS";
        strcpy(contents,temp);
        i=strlen(contents);
        i++;
    }
    contents[i]='\0';





    sntd=send(ns,contents,sizeof(contents),0);
    if(sntd==-1)
    {
        perror("\nerror sending");
        exit(0);
    }
    //printf("\nSent succesfully");
    //printf("\n");
}
close(s);
}

客户程序

#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<unistd.h>

int main()
{

int s,b,opt,port,r,len,sntd,recb;
char server_addr[100],*gets_func;
struct sockaddr_in server,client;
char buff[50];
printf("Enter the port number for client");
scanf("%d",&port);

// The socket is now being created
s=socket(AF_INET,SOCK_STREAM,0);
if(s==-1)
{
    perror("SOCKET NOT CREATED \n");
    exit(0);
}
printf("SOCKET SUCCESSFULL ");
printf("\n Do you wish to input address for client \n 1.YES 2.NO : ");
scanf("%d",&opt);

if(opt==1)
{
    printf("Input the address of ther server :");
    scanf("%s",server_addr);
    printf("%s",server_addr);
    server.sin_addr.s_addr=inet_addr(server_addr);  
}
else
{
    server.sin_addr.s_addr=inet_addr("127.0.0.3");

}
server.sin_family=AF_INET;
server.sin_port=htons(port);
// Bind the server to the given address

r=connect(s,(struct sockaddr*)&server,sizeof(server));
if(r==-1)
{
    perror("Failed connecting");
    exit(0);
}
printf("\nConnected succesfully");
while(1)
{
    printf("\n Type File name:");
    scanf("%s",buff);


    sntd=send(s,buff,sizeof(buff),0);
    if(sntd==-1)
    {
        perror("\n Message not send error :");
        exit(0);
    }



    if(strcmp(buff,"exit")==0)
        break;

    memset(buff,0,50);
    recb=recv(s,buff,sizeof(buff),0);
    if(recb==-1)
    {
        perror("\n error receving message : ");
        exit(0);
    }
    buff[recb]='\0';
    printf("\n %s", buff);
    printf("\n");
}
close(s);
}

【问题讨论】:

  • 是时候使用调试器了......
  • 您调用recv 并获得任意字节块。然后你将它传递给strcmp,它只适用于 C 风格的字符串,而不是任意的字节块。您忽略了recv 的返回值,因此您的代码不知道它有多少字节,也不知道它是否收到了整个消息。

标签: c sockets ubuntu unix-socket


【解决方案1】:

TCP 是字节流协议,而不是消息协议。如果要发送和接收消息,则必须编写“发送消息”和“接收消息”函数并调用它们。你不能只打电话给recv 并期望它知道你的消息是什么,因为它不知道。

【讨论】:

  • 这样做会给我一个糟糕的地址问题
  • 这可能是因为你关闭了监听套接字。但是你有更大的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多