LQ Newbie
Registered: Jun 2009
Posts: 1
Rep:
|
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);
}
|