下面的程序具有从客户机发送数据克到服务器的动机和数据GRAM被回送到客户机,作为确认。
我试图在一个空字符串从服务器端接受终止程序。我执行的程序中的Fedora 14。我遇到的错误是,有一个“在错误的SendTo” - 对非插槽插槽。
我无法找出错误。请不要指出错误。建议,欢迎。
我曾尝试阅读有关本等资源,但一直没能得到保持了它。
在此先感谢您的回答。
服务器:
#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#define PORT 7844
int main(int argc,char *argv[]) {
char buf[2000];
int sockfd,len,a;
struct sockaddr_in servaddr,cliaddr;
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
printf("Error creating socket\n");
exit(0);
}
printf("UDP Server Socket Created Successfully.\n");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(PORT);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
{
perror("Error binding socket.");
exit(0);
}
printf("UDP Server Socket Binded.\n");
len=sizeof(cliaddr);
do {
strcpy(buf," ");
if((a=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len))<0){
perror("ERROR");
exit(0);
}
printf("From Client : %s",buf);
if((sendto(sockfd,buf,a,0,(struct sockaddr *)&cliaddr,len))<0)
{
perror("NOTHING SENT");
exit(0);
}
printf("Server : ");
fgets(buf,sizeof(buf),stdin);
if((sendto(sockfd,buf,a,0,(struct sockaddr *)&cliaddr,len))<0)
{
perror("NOTHING SENT");
exit(0);
}
}
while(strcmp(buf," ")!=0);
close(sockfd);
return 0;
}
客户
#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#define PORT 7844
int main(int argc,char *argv[]) {
int sockfd,len;
struct sockaddr_in serv,cliaddr;
char buff[2000];
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("ERROR creating socket");
exit(0);
}
printf("UDP Client Socket Created Successfully.\n");
memset(&serv,0,sizeof(serv));
serv.sin_family=AF_INET;
serv.sin_port=htons(PORT);
serv.sin_addr.s_addr=inet_addr(argv[1]);
do
{
printf("Client : ");
fgets(buff,sizeof(buff),stdin);
if((sendto(sockfd,buff,sizeof(buff),0,(struct sockaddr *)&serv,sizeof(serv)))<0) {
perror("ERROR IN SENDTO");
}
if(strcmp(buff," ")==0) {
exit(0);
}
strcpy(buff," ");
if((recvfrom(sockfd,buff,sizeof(buff),0,(struct sockaddr *)&cliaddr,&len))<0) {
perror("ERROR IN RECVFROM");
exit(0);
}
fputs("From Server : ",stdout);
fputs(buff,stdout);
} while(strcmp(buff," ")!=0);
close(sockfd);
return 0;
}
请让我知道,如果我可以终止使用空字符串的程序。也让我知道在程序中的缺陷。再一次感谢你。
您正在使用fgets
从man fgets
fgets()
至多一个小于从流,并将它们存储大小的字符到缓冲器中读出由s指向。一个EOF或换行后读停止。如果一个换行符被读取,它被保存到缓冲区。
所以,当你输入一个空格,然后按返回,你会得到" \n"
不是你的测试" "
。