Client-server model using C socket programming (Unix Domain) -
i'm new sockets in programming language , have been reading socket using c programming. found tutorial on linuxhowtos presents implementation of socket in internet domain. page says there exists way implement sockets in unix domain. how can following code (taken linuxhowtos) can changed in order implement socket in unix domain?
server.c
/* simple server in internet domain using tcp port number passed argument */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> void error(const char *msg) { perror(msg); exit(1); } int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; int n; if (argc < 2) { fprintf(stderr,"error, no port provided\n"); exit(1); } sockfd = socket(af_inet, sock_stream, 0); if (sockfd < 0) error("error opening socket"); bzero((char *) &serv_addr, sizeof(serv_addr)); portno = atoi(argv[1]); serv_addr.sin_family = af_inet; serv_addr.sin_addr.s_addr = inaddr_any; serv_addr.sin_port = htons(portno); if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) error("error on binding"); listen(sockfd,5); clilen = sizeof(cli_addr); newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) error("error on accept"); bzero(buffer,256); n = read(newsockfd,buffer,255); if (n < 0) error("error reading socket"); printf("here message: %s\n",buffer); n = write(newsockfd,"i got message",18); if (n < 0) error("error writing socket"); close(newsockfd); close(sockfd); return 0; }
client.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> void error(const char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[256]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); sockfd = socket(af_inet, sock_stream, 0); if (sockfd < 0) error("error opening socket"); server = gethostbyname(argv[1]); if (server == null) { fprintf(stderr,"error, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = af_inet; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("error connecting"); printf("please enter message: "); bzero(buffer,256); fgets(buffer,255,stdin); n = write(sockfd,buffer,strlen(buffer)); if (n < 0) error("error writing socket"); bzero(buffer,256); n = read(sockfd,buffer,255); if (n < 0) error("error reading socket"); printf("%s\n",buffer); close(sockfd); return 0; }
the thing found has changed instead of using struct:
#include <netinet/in.h> struct sockaddr_in { short sin_family; /* must af_inet */ u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; /* not used, must 0 */ };
yo have use following struct allows local inter-process communication:
#include<sys/un.h> struct sockaddr_un { sa_family_t sun_family; /* af_unix */ char sun_path[108]; /* pathname */ };
Comments
Post a Comment