套接字编程实现简单的客户端和服务器,通过网络进行通信并实现简单的客户端服务器通信。客户端在预定义的端口上与服务器打开会话,然后提供一行文本消息。TCP套接字编程
服务器在标准输出上输出文本消息,并且还继续运行以接收更多的文本消息。
当客户端通过选择退出选项关闭会话时,应正常终止到服务器的连接。
当通过按下控件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(),并了解至少对于套接字来说,这两个函数不一定读取/写入尽可能多的字节,但很少。因此,围绕这种调用计数,直到所有数据或终结者已被读/写是一个好主意,而不是说必要的必要条件。 – alk