below im trying to create a function makeaddr that will take a few options and take most of the work out of creating a socket, the code compiles ok with no warnings, but it seg faults.
I'm pretty sure it has something to do with the int sock and me passing the socket file descriptor ?
in the socket and bind functions calls i originally didnt have the *s = only had s = but it compiled with warnings and segfaulted.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <errno.h>
void bail (char *msg){
fputs(strerror(errno),stderr);
fputs(": ",stderr);
fputs(msg,stderr);
fputc('\n',stderr);
exit(1);
}
int makeaddr(void * addr, int len, int *s, char *type, char *ip, int port){
//takes &addr,sizeof(addr), &sock,"TCP",ipaddr, port number
int Default_port = 3099;
struct sockaddr_in *ad = (struct sockaddr_in *)addr;
memset(&addr,0,len);
ad->sin_family = AF_INET;
if(strcmp(ip,NULL)==0){
ad->sin_addr.s_addr = INADDR_ANY;
}
else{
ad->sin_addr.s_addr = inet_addr(ip);
}
if(port == 0){
ad->sin_port = htons(Default_port);
}
else{
ad->sin_port = htons(port);
}
//we have created the address structure. Now create the socket
if(strcmp(type,"TCP")==0){
if(*s = socket(AF_INET,SOCK_STREAM,0)== -1)
bail("TCP Sock Error");
if(bind(*s,(struct sockaddr*)&addr,len)== -1){
bail("TCP Bind Error");
}
printf("TCP Socket Successfully created: On Port %d \n",(int)ad->sin_port);
}
else{
if(*s = socket(AF_INET,SOCK_DGRAM,0)== -1)
bail("UDP Sock Error");
if(bind(*s,(struct sockaddr*)&addr,len)== -1){
bail("UDP Bind Error");
}
printf("UDP Socket Successfully created: On Port %d \n",(int)ad->sin_port);
}
}
int main(int argc, char *argv[]){
int sock;
struct sockaddr_in addr;
//takes &addr,sizeof(addr), &sock,"TCP",ipaddr, port number
makeaddr(&addr,sizeof(addr),&sock,"TCP",NULL,0);
close(sock);
return 0;
}