【问题标题】:TCP socket programmingTCP套接字编程
【发布时间】: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() 的手册页,并了解到至少对于套接字,这两个函数不一定读/写与他们被告知的一样多的字节,但很少。因此,循环计算此类调用,直到所有数据或终止符都被读/写是一个好主意,而不是说必要的。

标签: c sockets tcp


【解决方案1】:

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

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

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

此代码多年来一直被批准使用,没有任何问题。我在商业产品中使用它,可以向您保证它是防弹的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2021-11-12
    • 1970-01-01
    • 2018-09-13
    相关资源
    最近更新 更多