【发布时间】:2014-02-25 18:11:50
【问题描述】:
Socket 编程实现一个简单的客户端和服务器通过网络进行通信并实现一个简单的客户端服务器通信。客户端在预定义的端口上打开与服务器的会话,然后提供一行文本消息。
服务器在标准输出上输出文本消息,并继续运行以接收更多文本消息。
当客户端通过选择退出选项关闭会话时,与服务器的连接应正常终止。
当服务器通过按下控制 C 终止时,服务器也应该优雅地释放打开的套接字。
我已经完成了这个程序,但是当我输入字符串并在客户端按回车时,它不会出现在服务器中,但是当我第二次输入时,第一个输入出现并且第二个正在等待。
第三个输入完成后出现第二个...
我能找到解决这个问题的方法吗?
//Server.c
int main()
{
int listenfd = 0;
int confd=0;
struct sockaddr_in sa;
char msg[1025];
char c[1];
int i;
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd<0)
{
perror("Socket");
return 1;
}
sa.sin_family = AF_INET;
sa.sin_port = htons(1234);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
while((bind(listenfd,(struct sockaddr*)&sa,sizeof(sa))<0)){return 1;}
printf("\nBind Successfull");
listen(listenfd,10);
while(1){
confd=accept(listenfd,(struct sockaddr*)NULL,NULL);
printf("\nConnected");
memset(msg,0x0,10);
do{
read(confd,c,1);
if(strcmp(c,"n")!=0)
{
read(confd,msg,10);
printf("\n%s",msg);
memset(msg,0x0,10);
}
else{
confd=accept(listenfd,(struct sockaddr *)NULL,NULL);
printf("\nWaiting..");
//close(confd);
}
// write(confd,msg,10);
//}
//msg[rc]='\0'
}while(1);
close(confd);
}
}
//Client.c
int main()
{
int sock1= 0;
FILE *serv;
struct sockaddr_in server,clin;
char msg[1024],c[1];
server.sin_family = AF_INET;
server.sin_port = htons(1234);
if(inet_pton(AF_INET,"192.168.125.7",&server.sin_addr)<0)
{
perror("inet_pton");
return 1;
}
if((sock1 = socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
if(connect(sock1,(struct sockaddr*)&server,sizeof(server))<0)
{
perror("Connect");
return 1;
}
//printf("\nEnter 'y' to exit.");
while(1){
// memset(&msg, '0', sizeof(msg));
printf("\nDo you want to continue(y/n):");
scanf(" %[^\n]",c);
if(strcmp(c,"y")==0){
printf("\nEnter String:");
scanf("%c",&c);
scanf(" %[^\n]",msg);
printf("\nSending String to server..");
//scanf("%c",&c);
write(sock1,c,1);
write(sock1,msg,10);
}
if(strcmp(c,"n")==0)
{
write(sock1,c,10);
exit(1);
}
}
close(sock1);
printf("\n");
}
【问题讨论】:
-
仔细阅读 read()/write() 的手册页,并了解到至少对于套接字,这两个函数不一定读/写与他们被告知的一样多的字节,但很少。因此,循环计算此类调用,直到所有数据或终止符都被读/写是一个好主意,而不是说必要的。