套接字编程:recv / read问题

前端之家收集整理的这篇文章主要介绍了套接字编程:recv / read问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑:下面的代码已经被修改为正确接收和发送,并考虑到发送的消息的实际字节数(后者由于EJP)

我正在用Unix编程.

我有服务器和客户端应该交换msgs.虽然客户端似乎发送消息正常,但服务器不会收到客户端发送的消息.我已经尝试使用recv()和read()(我知道他们几乎是相同的事情,但额外的标记在recv()),但我没有运气,我不知道真的是什么问题.

每次发送消息后,我将睡眠(3)放入客户端代码,但是我看到一旦客户端和服务器连接,服务器立即关闭,而不用等待传入的消息.我究竟做错了什么?

这是客户端代码

#define SERVER_TCP_PORT 11112
#define MAX_DATA_SIZE   500

int main(int argc,char * argv[])
{
    int sockfd;
    char * host;
    char msg[MAX_DATA_SIZE];/* = "get my msg!\n";*/
    int msg_len;

    struct hostent * hp;
    struct sockaddr_in client_address,server_address;


    printf("y halo thar\n");


    // looking up from the host database
    if (argc == 2)
        host = argv[1];
    else
        exit(1);
    printf("sdf\n");


    hp = gethostbyname(host);
    if (!hp)
        exit(1);
    printf("host found\n");


    // setting up address and port structure information
    bzero((char * ) &server_address,sizeof(server_address)); // copy zeroes into string
    server_address.sin_family = AF_INET;
    bcopy(hp->h_addr,(char *) &server_address.sin_addr,hp->h_length);
    server_address.sin_port = htons(SERVER_TCP_PORT);
    printf("set\n");


    // opening up socket
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
        exit(1);
    printf("opened\n");


    // connecting
    if (connect(sockfd,(struct sockaddr *) &server_address,sizeof(server_address)) < 0)
        exit(1);
    printf("connected\n");


    int i;

    for (i = 0; i < MAX_DATA_SIZE; ++i)
    {
        msg[i] = '.';
    }

    msg[MAX_DATA_SIZE-1] = '\0';

    for(i = 0; i < 11; i++)
    {
        // send message to connected socket
        msg_len = write(sockfd,msg,MAX_DATA_SIZE);
        if(msg_len < 1)
            printf("notsent\n");
        else
            printf("%i  bytes sent\n",msg_len);

        // recieve messages from connected socket
        msg_len = read(sockfd,MAX_DATA_SIZE);
        if (msg_len < 1)
            printf("not recieved\n");
        else
        {
            printf("%i bytes received\n",msg_len);
            printf(msg);
            printf("\n");

        }
    }


    // close connection
    close(sockfd);
    printf("closed\n");

}

这是服务器端

#define SERVER_TCP_PORT 11112
#define MAX_DATA_SIZE   500


int main()
{

    printf("o halo thar\n");

    int sockfd,new_sockfd;
    int client_addr_len;
    char msg [MAX_DATA_SIZE];
    int msg_len;
    char got_msg [11] = "got ur msg\0";
    struct sockaddr_in server_address,client_address;


    // setting up address and port structure information
    bzero((char * ) &server_address,sizeof(server_address)); // copy zeroes into string
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(SERVER_TCP_PORT);


    // opening up socket
    if ((sockfd = socket(AF_INET,0)) < 0 )
        exit(1);
    printf("socket is opened\n");


    // binding
    if (bind(sockfd,sizeof(server_address)) < 0)
        exit(1);
    printf("socket is bound\n");


    // listening
    listen(sockfd,5);
    printf("listening\n");

    // block and wait for an incoming connection

    client_addr_len = sizeof(client_address);
    new_sockfd = accept(sockfd,(struct sockaddr *) &client_address,&client_addr_len);
    if (new_sockfd < 0)
        exit(1);

    printf("accepted\n");


    int i;

    for( i = 0; i < 11; i++)
    {
        // recieve messages from connected socket
        printf("waiting\n");
        msg_len = read(new_sockfd,MAX_DATA_SIZE);
        if (msg_len < 1)
        {
            printf("no msg recieved\n");    
        }
        else
        {
            printf("bytes recieved: %i\n",msg_len);
        }


        // send message to connected socket
        msg_len = write(new_sockfd,got_msg,sizeof(got_msg));
        if (msg_len < 1)
            printf("not sent\n");
        else
            printf("%i bytes sent\n",msg_len);
    }


    // close connection
    close(sockfd);
    printf("socket closed. BYE! \n");


}

解决方法

在服务器代码中,问题出在这一行上:
msg_len = read(sockfd,MAX_DATA_SIZE);

你在sockfd上调用read,但是你需要在new_sockfd(由accept()返回的socket上)调用read或recv. new_sockfd是连接到客户端的(sockfd用于接受进一步的连接 – 例如,如果另一个客户端连接).

猜你在找的C&C++相关文章