套接字編程實現簡單的客戶端和服務器,通過網絡進行通信並實現簡單的客戶端服務器通信。客戶端在預定義的端口上與服務器打開會話,然後提供一行文本消息。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