无法在套接字通信中接收服务器端的数据

时间:2014-11-06 12:11:17

标签: c sockets client server

我有以下代码。我想做多播套接字通信。我能够从服务器发送数据到没有客户端,但同时我想从客户端接收数据。我喜欢和小组聊天一样。但是当我插入read()recvfrom()服务器停止执行时。所以我想把它添加到在客户端做的组IP。但它没有帮助..任何建议..?

Server.c

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
struct in_addr localInterface;
struct sockaddr_in groupSock;
struct ip_mreq group;
int sd,len,n=0;
char databuf[1024]; //= "Multicast test message lol!";
int datalen = sizeof(databuf);

int main (int argc, char *argv[ ])
{
    /* Create a datagram socket on which to send. */
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sd < 0)
    {
        perror("Opening datagram socket error");
        exit(1);
    }
    else
        printf("Opening the datagram socket...OK.\n");
    /* Initialize the group sockaddr structure with a */
   /* group address of 225.1.1.1 and port 5555. */
    len=sizeof(groupSock);
    memset(&groupSock, 0, len);
    groupSock.sin_family = AF_INET;
    groupSock.sin_addr.s_addr = inet_addr("226.1.1.1");
    groupSock.sin_port = htons(4321);

   /* Set local interface for outbound multicast datagrams. */
   /* The IP address specified must be associated with a local, */
    /* multicast capable interface. */
    localInterface.s_addr = INADDR_ANY;//inet_addr("10.99.92.101");

    if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0)
    {
        perror("Setting local interface error");
        exit(1);
    }
    else
        printf("Setting the local interface...OK\n");

    {
        perror("bind error");
        exit(1);
    }
    while(1)
    {
        printf("\nEnter data for clients: ");
        scanf("%s",databuf);
        if(sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0)
            {perror("Sending datagram message error");}
            else
            printf("Sending datagram message...OK\n");
    }
    return 0;
}

client.c

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>

struct sockaddr_in localSock;
struct ip_mreq group;
int sd;
int datalen;
char databuf[1024];

int main(int argc, char *argv[])
{
    /* Create a datagram socket on which to receive. */
    sd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sd < 0)
    {
        perror("Opening datagram socket error");
        exit(1);
    }
    else
        printf("Opening datagram socket....OK.\n");
    /* Enable SO_REUSEADDR to allow multiple instances of this */
        /* application to receive copies of the multicast datagrams. */
    {
        int reuse = 1;
        if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
        {
            perror("Setting SO_REUSEADDR error");
            close(sd);
            exit(1);
        }
        else
            printf("Setting SO_REUSEADDR...OK.\n");
    }
    /* Bind to the proper port number with the IP address */
    /* specified as INADDR_ANY. */
    memset((char *) &localSock, 0, sizeof(localSock));
    localSock.sin_family = AF_INET;
    localSock.sin_port = htons(4321);
    localSock.sin_addr.s_addr = INADDR_ANY;
    if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock)))
    {
        perror("Binding datagram socket error");
        close(sd);
        exit(1);
    }
    else
        printf("Binding datagram socket...OK.\n");
    /* Join the multicast group 226.1.1.1 on the local */
    /* interface. Note that this IP_ADD_MEMBERSHIP option must be */
    /* called for each local interface over which the multicast */
    /* datagrams are to be received. */
    group.imr_multiaddr.s_addr = inet_addr("226.1.1.1");
    group.imr_interface.s_addr = INADDR_ANY;
    if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
    {
        perror("Adding multicast group error");
        close(sd);
        exit(1);
    }
    else
        printf("Adding multicast group...OK.\n");
    /* Read from the socket. */
    while(1)
    {
        datalen = sizeof(databuf);

        if(read(sd, databuf, datalen) < 0)
        {
            perror("Reading datagram message error");
            close(sd);
            exit(1);
        }
        else
        {
            printf("Reading datagram message...OK.\n");
            printf("The message from multicast server is: \"%s\"\n", databuf);
        }   
    }
    return 0;
    }

1 个答案:

答案 0 :(得分:0)

我尝试执行您的代码,但我无法从客户端向服务器发送消息。我已经包含了errno.h,下面的代码片段给了我一个错误&#34;传输端点未连接&#34; 。所以你的问题很混乱,你说你能够从服务器发送数据到没有客户端吗?但是他的代码没有这样做?请更具体。

  int n;
  n = write(sd,databuf,datalen);

  if(n == -1) printf("writing error %s\n",strerror(errno);