在套接字编程中消息不是从服务器传递到客户端

时间:2018-02-01 14:20:02

标签: c sockets server client

客户端代码

  #include  <stdio.h>
#include    <stdlib.h>
/*
#include    <modes.h>
#include    <events.h>
#include    <process.h>
#include    <alarm.h>
#include    <signal.h>
#include    <module.h>
#include    <sg_codes.h>
#include    <sgstat.h>
#include    <sys/types.h>
*/
#include    <netinet/in.h>
#include    <arpa/inet.h>
#include    <sys/socket.h>
#include    <string.h>
#include    <time.h>
#define     MAX 1024
int main ( int argc, char ** argv)
{

    printf("Check point 1\n");
    if (argc != 2)
    {
        printf("Error!! Provide a correct port\n");
        exit (0);
    }


    unsigned char buff[MAX];
    int port = atoi(argv[1]);
    int sockfd;
    struct sockaddr_in myAddr, Addr;
    unsigned char temp[MAX];
    char buffer [MAX];

    socklen_t addr_size;
    addr_size = sizeof(Addr);


    //_os_getime();
    printf("Check point 2\n");
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0))< 0)
    {
        printf ( "%d", sockfd);
            perror("socket failed");
            exit(EXIT_FAILURE);
    }

    memset(&myAddr,'\0', sizeof(myAddr));
    myAddr.sin_family = AF_INET;
    myAddr.sin_port = htons(port);
    myAddr.sin_addr.s_addr =inet_addr("127.0.0.1");

    printf ("Check point 3");
    strcpy(buff, "ABCDE\n");
    if((sendto(sockfd, buff, MAX, 0 , (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
    {
        perror("Sending failed--");
            exit(EXIT_FAILURE);

    }

    printf ("Check point 4");

    if((recvfrom(sockfd, buffer, sizeof(buffer), 0 , (struct sockaddr*) &Addr, &addr_size))<0)
    {
        perror("Receiving failed");
            exit(EXIT_FAILURE);
    }

    printf ( "%s", buff);


    close(sockfd);
    return 0;

}   

服务器代码

#include    <stdio.h>
#include    <stdlib.h>
/*
#include    <modes.h>
#include    <events.h>
#include    <process.h>
#include    <alarm.h>
#include    <signal.h>
#include    <module.h>
#include    <sg_codes.h>
#include    <sgstat.h>
#include    <sys/types.h>
*/
#include    <netinet/in.h>
#include    <arpa/inet.h>
#include    <sys/socket.h>
#include    <string.h>
#include    <time.h>
#define     MAX 1024


int main (int argc, char ** argv)
{
    if (argc != 2)
    {
        printf("Error!! Provide a correct port\n");
        exit (0);
    }   


    int port = atoi(argv[1]);
    char buff[MAX];
    char buffer [MAX];
    int sockfd, clientfd;
    struct sockaddr_in myAddr, Addr;


    socklen_t addr_size;

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0))< 0)
    {
        printf ( "%d", sockfd);
            perror("socket failed");
            exit(EXIT_FAILURE);
    }

    memset(&myAddr,'\0', sizeof(myAddr));
    myAddr.sin_family = AF_INET;
    myAddr.sin_port = htons(port);
    myAddr.sin_addr.s_addr =inet_addr("127.0.0.1");
    if ((bind (sockfd, (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
    {
        perror("Binding failed");
            exit(EXIT_FAILURE);
    }

    addr_size = sizeof(Addr);


    int recv = recvfrom(sockfd, buff, MAX, 0 , (struct sockaddr*) &Addr, &addr_size);
    printf ( "%s", buff);   

    strcpy(buffer, "EFGH");
    if((sendto(sockfd, buffer, MAX, 0 , (struct sockaddr*) &myAddr, sizeof(myAddr)))<0)
    {
        perror("Sending failed");
            exit(EXIT_FAILURE);

    }   
    close(sockfd);

    return 0;
}

我已编辑了我的问题, 这次我编写了一个没有任何结构的简单代码,并添加了错误检查。 当我启动服务器然后启动客户端时,消息ABCDE被发送到服务器并且消息将在服务器上打印并且服务器将被终止。 但是在客户端,代码不会被终止并且只能执行到检查点2.我不理解我的至少检查点3即使下一行正在工作也没有打印。 当然,从服务器到客户端的消息也没有打印出来

1 个答案:

答案 0 :(得分:1)

您必须使用相同的套接字客户端。当您将第一个数据包发送到服务器时,它会收到任意地址。服务器知道该地址,因为它从调用recvfrom获取它并使用它发送自己的数据包。

这意味着在客户端,数据包是在绑定到该地址的套接字上接收的,即用于发送第一个数据包的套接字。当您尝试从不同的套接字读取时,您永远不会读取该数据包。

正如Someprogrammerdude在评论中所说,客户端和服务器中的数据包大小不匹配。

因此在client.c中更改2行足以解决问题:

#define     MAX 500

        int  rec_size = recvfrom(sockfd, &recv, sizeof(frame), 0 ,
             (struct sockaddr*) &Addr, &addr_size); 

但是这里仍然存在很多问题,因为您还应该使用一个单一的套接字服务器端并添加错误检查。