Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets sendto()在服务器中返回-1_Sockets_Unix_Network Programming - Fatal编程技术网

Sockets sendto()在服务器中返回-1

Sockets sendto()在服务器中返回-1,sockets,unix,network-programming,Sockets,Unix,Network Programming,} 我正在尝试使用UDP制作一个简单的文件传输程序。问题是sendto()总是返回-1。这是服务器的代码。您的代码有很多问题。您看到的一个问题是您没有正确地填写变量client:系统调用的recvfrom输入和输出都使用clientsize参数,因此您需要将其初始化为client结构的大小: int main() { int servsocket,clientsocket; struct sockaddr_in server,client; FILE *file; cha

}


我正在尝试使用UDP制作一个简单的文件传输程序。问题是sendto()总是返回-1。这是服务器的代码。

您的代码有很多问题。您看到的一个问题是您没有正确地填写变量
client
:系统调用的
recvfrom
输入和输出都使用
clientsize
参数,因此您需要将其初始化为
client
结构的大小:

int main()
{
   int servsocket,clientsocket;
   struct sockaddr_in server,client;
   FILE *file;
   char filename[100];
   char buf[1024];

    servsocket=socket(AF_INET,SOCK_DGRAM,0);

    server.sin_addr.s_addr=htonl(INADDR_ANY);
    server.sin_port=htons(6003);
    server.sin_family=AF_INET;

    bind(servsocket,(struct sockaddr *) &server,sizeof(server) );

    while(1){   
        int clientsize=0;
        printf("Waiting for file requests \n");
       recvfrom(servsocket,filename,sizeof(filename),0,(struct          sockaddr *)&client,&clientsize);

     file=fopen(filename,"r");
     int size=0;

 do
 {
      size=fread(buf,1,sizeof(buf),file);
      printf("%d bytes read \n",size);
     int sentbytes=  sendto(servsocket,(const char *)buf,size,0,       (struct sockaddr *) &client,sizeof(client));
    printf("%d bytes sent ",sentbytes);         
    }while(size==sizeof(buf));  

   }                
另一个问题是您没有0-终止
文件名
字符串:

int clientsize = sizeof(struct sockaddr_in);

最后,您没有测试错误(
bind
recvfrom
sendto
,等等)。这会给你带来麻烦,我保证。

事实上,我只需要让它尽快工作,最终的代码将进行正确的错误检查,我只是用客户端结构的大小初始化了clientsize,我现在遇到了一个分段错误。“你能帮我一下吗?”穆罕默德·穆扎米尔说,实际上这是胡说八道。让它尽快工作的方法是进行正确的错误检查。当系统调用返回-1时,您应该提取
errno
值,调用
peror(),
,以便知道它返回-1的原因。那么你甚至不必在这里问这个问题。
n = recvfrom(...);
filename[n] = '\0';