2014-02-25 95 views
0

套接字编程实现简单的客户端和服务器,通过网络进行通信并实现简单的客户端服务器通信。客户端在预定义的端口上与服务器打开会话,然后提供一行文本消息。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"); 
} 
+0

仔细阅读手册页以获取read()/ write(),并了解至少对于套接字来说,这两个函数不一定读取/写入尽可能多的字节,但很少。因此,围绕这种调用计数,直到所有数据或终结者已被读/写是一个好主意,而不是说必要的必要条件。 – alk

回答

0

套接字编程并不是一件容易的事情,尤其是如果你希望代码是非阻塞的。 我建议您使用现有的代码,而不是从头开始编写代码。浪费大量时间重新发明轮子!

在这里,您可以在演示应用程序的一个* .cpp文件中找到线程安全的C++ Socket类,它可以显示双向发送和接收字符串的热度,甚至可以使用演示应用程序连接到Telnet服务器等等...

http://www.codeproject.com/Articles/34163/A-Universal-TCP-Socket-Class-for-Non-blocking-Serv

该代码被批准,因为几年没有任何问题的工作。我用它在商业产品中,并可以向你保证它是防弹的。