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

问题描述:

我有以下代码。我想做组播套接字通信。我能够将数据从服务器发送到任何客户端,但同时我想从客户端接收数据。我想做类似群聊。但是当我插入read()recvfrom()服务器停止执行。所以我想把它添加到在客户端完成的Group 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; 
    } 

我试图执行代码,但我不能从客户端向服务器发送消息的。我已经包含了errno.h,下面的代码给了我一个错误“传输端点未连接”。所以你的问题很混乱,你说你能够将数据从服务器发送到任何客户端?但他的代码没有这样做?请更具体一些。

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

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

更新了代码!它的工作现在...我的意思是这是发送消息给多个客户端...但现在我想从客户端收到消息...我应该做什么改变? – Amit 2014-11-07 05:42:14