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';