All of lore.kernel.org
 help / color / mirror / Atom feed
* Latest lksctp-dev tree broke sctp_sendmsg()?
@ 2008-04-21  9:31 Horacio Sanson
  2008-04-21 13:37 ` Neil Horman
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Horacio Sanson @ 2008-04-21  9:31 UTC (permalink / raw)
  To: linux-sctp

I have a small echo server/client program for testing. It works in
linux kernel 2.6.22-14 (Ubuntu) but using the latest lksctp-dev tree
(from git) I get "invalid parameter" errors when calling
sctp_sendmsg().

Any directions are appreciated:

Horacio



###############
# server code
###############
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>

#define MAXLINE     255
#define LISTENQ     1024
#define SERV_PORT   9879
#define BUFFSIZE    8192

int main(int arvc, char **argv)
{
    int sock_fd, msg_flags, ret;
    char readbuf[BUFFSIZE];

    struct sockaddr_in servaddr, cliaddr;
    struct sctp_sndrcvinfo sri;
    struct sctp_event_subscribe evnts;

    socklen_t len;
    size_t rd_sz;

    sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

    if(sock_fd < 0) {
        printf("socket creation error\n");
        perror("socket");
        exit(1);
    }

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    bind(sock_fd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    bzero(&evnts,sizeof(evnts));

    evnts.sctp_data_io_event = 1;
    ret = setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));

    if(ret < 0) {
        printf("error setting socket options\n");
        exit(1);
    }

    ret = listen(sock_fd, LISTENQ);

    if(ret < 0) {
        printf("error linstening socket\n");
        perror("listen");
        exit(1);
    }


    for(;;) {
        len = sizeof(struct sockaddr_in);
        rd_sz = sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),
                             (struct sockaddr *) &cliaddr, &len,
                              &sri, &msg_flags);

        if(rd_sz <= 0) {
            continue;
        }

        printf("From str:%d seq:%d (assoc:0x%x):",
               sri.sinfo_stream,sri.sinfo_ssn,
               (u_int)sri.sinfo_assoc_id);
        printf("%.*s\n",rd_sz,readbuf);

        sctp_sendmsg(sock_fd, readbuf, rd_sz, (struct sockaddr *)&cliaddr,
                     len, sri.sinfo_ppid, sri.sinfo_flags,sri.sinfo_stream,
                     0,0);
    }
}




###############
# client code
###############
#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>

#define MAXLINE     255
#define LISTENQ     1024
#define SERV_PORT   9879
#define BUFFSIZE    8192


int main(int argc, char **argv)
{
    int sock_fd, ret;
    struct sockaddr_in servaddr;
    struct sctp_sndrcvinfo sri;
    struct sctp_event_subscribe evnts;
    char sendline[MAXLINE], recvline[MAXLINE];
    socklen_t len;
    int wr_sz, rd_sz;
    int msg_flags;

    if(argc < 4) {
        printf("Usage: %s [server_ip] [strno] [message]\n",argv[0]);
        exit(1);
    }

    sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

    if(sock_fd < 0) {
        printf("socket creation error\n");
        exit(1);
    }

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);

    ret = inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    if(ret < 0) {
        perror("inet_pton");
        exit(1);
    }

    bzero(&evnts, sizeof(evnts));
    evnts.sctp_data_io_event = 1;
    ret = setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));

    if(ret < 0) {
        printf("error setting socket options\n");
        exit(1);
    }

    len = sizeof(struct sockaddr_in);
    bzero(&sri, sizeof(sri));
    sri.sinfo_stream = strtol(argv[2],NULL,0);
    snprintf(sendline,MAXLINE,"%s",argv[3]);
    wr_sz = strlen(sendline);

    printf("Say str:%d  msg: %s\n",sri.sinfo_stream, sendline);

    ret = sctp_sendmsg(sock_fd, sendline, wr_sz, (struct sockaddr *) &servaddr,
                       len,0,0,sri.sinfo_stream,0,0);

    if(ret < 0) {
        perror("sctp_sendmsg");
        exit(1);
    }

    len = sizeof(servaddr);

    rd_sz = sctp_recvmsg(sock_fd, recvline, sizeof(recvline),
                         (struct sockaddr *)&servaddr, &len,
                          &sri,&msg_flags);

    if(rd_sz < 0) {
        perror("sctp_recvmsg");
        exit(1);
    }

    printf("echo str:%d seq:%d (assoc:0x%x):",
           sri.sinfo_stream,sri.sinfo_ssn,
           (u_int)sri.sinfo_assoc_id);
    printf("%.*s\n",rd_sz,recvline);

}

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-04-24  1:37 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-21  9:31 Latest lksctp-dev tree broke sctp_sendmsg()? Horacio Sanson
2008-04-21 13:37 ` Neil Horman
2008-04-21 14:14 ` David Pascoe
2008-04-21 14:41 ` Vlad Yasevich
2008-04-21 15:10 ` Vlad Yasevich
2008-04-22  0:36 ` Horacio Sanson
2008-04-22 13:00 ` Neil Horman
2008-04-22 14:36 ` Horacio Sanson
2008-04-22 15:00 ` Vlad Yasevich
2008-04-24  1:20 ` Horacio Sanson
2008-04-24  1:37 ` Vlad Yasevich

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.