Sorry: 
        I am not sure whether it is the right place to ask this question. if 
not, do please tell me ,where I should ask the question.
       I write a small sctp server program, but when build with 
cc(sunstudio11,cc -g server.c -lnsl -lsocket -lsctp) in soalris 10, it always 
return error, but works well when build with /usr/sfw/gcc  -g server.c -lnsl 
-lsocket -lsctp.
when build with cc, the program keeps saying: "sctp_failed: 11:Resource 
temporarily unavailable"
     what should I do, as I want to use cc.thanks.
     following is my program:
#include        <sys/socket.h>  /* basic socket definitions */
#include        <netinet/in.h>  /* sockaddr_in{} and other Internet defns */
#include <errno.h>
#include        <arpa/inet.h>   /* inet(3) functions */
#include        <netinet/sctp.h> /* note if sctp does not exist we blow up :> */
#include<stdlib.h>
#include <string.h>
#include<strings.h>
#define BUFFSIZE 100
#define SERV_PORT 8080
#define SA      struct sockaddr

int
main(int argc, char **argv)
{
        int             sock_fd, msg_flags;
        char            readbuf[BUFFSIZE];
        struct sockaddr_in servaddr, cliaddr;
        struct sctp_sndrcvinfo sri;
        struct sctp_event_subscribe evnts;
        int             stream_increment = 1;
        socklen_t       len;
        int          rd_sz;

        sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
//      sock_fd = socket(AF_INET, SOCK_STREAM, 0);
        memset(&servaddr,0, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr.sin_port = htons(SERV_PORT);

        if(bind(sock_fd, (SA *) & servaddr, sizeof(servaddr))<0)
{
printf("bind failed for:%s\n",strerror(errno));
exit(1);

}
        memset(&evnts,0, sizeof(evnts));
        evnts.sctp_data_io_event = 1;
        if(setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS,
                   &evnts, sizeof(evnts))<0)
{
printf("setsockopt failed for:%s\n",strerror(errno));
exit(1);
}

        if(listen(sock_fd, 7)<0)
{
printf("listen failed for:%s\n",strerror(errno));
exit(1);
}
        for (;;) {
                len = sizeof(struct sockaddr_in);
                rd_sz = sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
                                     (SA *) & cliaddr, &len,
                                     &sri, &msg_flags);
if(rd_sz<=0)
{
        printf("sctp_failed: %d:%s\n",errno, strerror(errno));
continue;
}

readbuf[rd_sz]=0;
printf("received:%s:length=%d\n",readbuf,rd_sz);
                sctp_sendmsg(sock_fd, readbuf, rd_sz,
                             (SA *) & cliaddr, len,
                             sri.sinfo_ppid,
                             sri.sinfo_flags,
                             sri.sinfo_stream,
                     0, 0);
        }
}
-- 
This message posted from opensolaris.org
_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to