LinuxQuestions.org
Review your favorite Linux distribution.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices


Reply
  Search this Thread
Old 06-10-2009, 06:40 AM   #1
deva199
LQ Newbie
 
Registered: Jun 2009
Posts: 1

Rep: Reputation: 0
SCTP one to one socket programming


i got a code for one to one SCTP server clinet programming. In the server side after accepting a connection, if i try to use the socket descriptor returned by the accept call I am getting "permission denied error" .The code is given below. please suggest solutions as it is required for my project.
server code..........................


#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILEBUFFERSIZE 1024
#define HTTP_PORT 8888
#define MAXFILETRANSFER 5
#define AVAILCONNECTION 10
int MakePassiveSock(unsigned short int portnumber);
int RecvMsg(int,char*);
int SendMsg(int,char*);
int main(int argc,char *argv[])
{
char msg[] = "WELCOME\n";
char tmp[FILEBUFFERSIZE];
int MasterSock;
int connfd;
char recvbuf[FILEBUFFERSIZE];
int ret;
struct sockaddr_in SockAddr;
socklen_t AddrLen = sizeof(SockAddr);
memset(&SockAddr,0,sizeof(SockAddr));
MasterSock = MakePassiveSock(HTTP_PORT);
if (MasterSock<0){
printf("MasterSock error!\n");
exit(-1);
}
printf("listening....\n");
connfd = accept(MasterSock,(struct sockaddr*)&SockAddr,(socklen_t*)&AddrLen);
if (connfd < 0)
{ printf("accept error! return code:%d\n",connfd);
exit(-1);
}

while(1)
{

if ((ret = RecvMsg(connfd,recvbuf)) == -1)
{
printf("Server recvive error\n");
exit(-1);
}
else if (ret == 0)
{
close(connfd);
printf("close connfd\n");
close(MasterSock);
printf("close MasterSock\n");
return 0;
}

printf("cmd> %s",recvbuf);

SendMsg(connfd,"ok");
}
printf("#end#\n");
return 0;
}
int MakePassiveSock(unsigned short int portnumber)
{
int PassiveSock;
struct sockaddr_in ServAddr;
int TransportType;
struct sctp_initmsg initmsg;
memset(&ServAddr,0,sizeof(ServAddr));
ServAddr.sin_family = PF_INET;
ServAddr.sin_addr.s_addr = INADDR_ANY;
ServAddr.sin_port = htons(portnumber);
TransportType = SOCK_STREAM;
PassiveSock = socket(PF_INET,TransportType,IPPROTO_SCTP);
if (PassiveSock < 0)
{
printf("Error to open socket!!!\n");
exit(-1);
}
if (bind(PassiveSock,(struct sockaddr*)&ServAddr,sizeof(ServAddr))<0)
{
printf("Error to bind socket!!!\n");
exit(-1);
}
bzero(&initmsg,sizeof(initmsg));

initmsg.sinit_num_ostreams = MAXFILETRANSFER;
initmsg.sinit_max_instreams = MAXFILETRANSFER;
initmsg.sinit_max_attempts = MAXFILETRANSFER-1;
setsockopt(PassiveSock,IPPROTO_SCTP,SCTP_INITMSG,&initmsg,sizeof(initmsg));

if (listen(PassiveSock,AVAILCONNECTION)<0)
{
printf("Error to listen!!!\n");
exit(-1);
}

return PassiveSock;
}
int RecvMsg(int skt,char *msg)
{
bzero(msg,FILEBUFFERSIZE);
return recv(skt,msg,FILEBUFFERSIZE,0);
}
int SendMsg(int skt,char *msg)
{
return send(skt,msg,strlen(msg),0);
}



client.code...............



#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HTTP_PORT 8888
#define FILEBUFFERSIZE 1024
#define MAXFILETRANSFER 5
int ServerSock;
int ConnectToServer(char *);
int RecvMsg(int,char *);
int SendMsg(int,char *);
int main(int argc,char *argv[])
{
char *ipaddr = argv[1];
char sendbuffer[FILEBUFFERSIZE];
char recvbuffer[FILEBUFFERSIZE];
struct sockaddr_in SockAddr;
int AddrLen = sizeof(SockAddr);
memset(ipaddr,0,sizeof(ipaddr));
if (argc < 2) {
printf("%s serverip\n",argv[0]);
return 0;
}
ServerSock = ConnectToServer(ipaddr);
printf("waiting for welcome....\n");
while(1) {

printf("Please input string:\n");
fgets(sendbuffer,FILEBUFFERSIZE,stdin);
if (strncmp(sendbuffer,"exit\n",strlen("exit\n"))==0)
{

break;
}
SendMsg(ServerSock,sendbuffer);
memset(recvbuffer,0,FILEBUFFERSIZE);

RecvMsg(ServerSock,recvbuffer);
} printf("#end#\n");
return 0; }
int ConnectToServer(char *ipaddr) {
int ServerSock;
struct sockaddr_in ServAddr;
int TransportType;
int ret;
struct sctp_event_subscribe events;
struct sctp_initmsg initmsg;

memset(&ServAddr,0,sizeof(ServAddr));
ServAddr.sin_family = PF_INET;
ServAddr.sin_addr.s_addr = inet_addr(ipaddr);
ServAddr.sin_port = htons(HTTP_PORT);
TransportType = SOCK_STREAM;
ServerSock = socket(PF_INET,TransportType,IPPROTO_SCTP);
if (ServerSock < 0)
{
printf("Error to open socket!!!\n");
exit(-1);
}
bzero(&initmsg,sizeof(initmsg));
initmsg.sinit_num_ostreams = MAXFILETRANSFER;
initmsg.sinit_max_instreams = MAXFILETRANSFER;
initmsg.sinit_max_attempts = MAXFILETRANSFER - 1;
setsockopt(ServerSock,IPPROTO_SCTP,SCTP_INITMSG,&initmsg,sizeof(initmsg));
if (connect(ServerSock,(struct sockaddr *)&ServAddr,sizeof(ServAddr)) < 0)
{
printf("Error to Connect socket!!!\n");
exit(-1);
}
bzero(&events,sizeof(events));
events.sctp_data_io_event = 1;
ret = setsockopt(ServerSock,IPPROTO_SCTP,SCTP_EVENTS,(const void*)&events,sizeof(events));
printf("ret:%d\n",ret);
return ServerSock;
}
int RecvMsg(int skt,char *msg)
{ bzero(msg,FILEBUFFERSIZE);
return recv(skt,msg,FILEBUFFERSIZE,0);
}
int SendMsg(int skt,char *msg) {
return send(skt,msg,strlen(msg),0);
}
 
Old 06-27-2011, 12:20 PM   #2
alegh19
LQ Newbie
 
Registered: Jun 2011
Posts: 1

Rep: Reputation: Disabled
you should be sure that you run server as root to open socket
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
SCTP Socket Creation Problem errno=94 dorobou Programming 10 04-24-2007 08:33 PM
Socket Programming ashley_31 Linux - Software 2 06-05-2006 02:30 AM
Socket programming maldini1010 Linux - Networking 2 01-27-2005 12:17 PM
socket programming pantera Programming 7 09-30-2004 03:39 PM

LinuxQuestions.org > Forums > Non-*NIX Forums > Programming

All times are GMT -5. The time now is 06:25 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration