Socket Programming in C (Client Server Example)

I am completely new to unix programming and have written the following code to program clients and servers. When I try to run client code, it says "Connection refused." Can someone please tell me what could be causing this.

Server Code:

#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include <errno.h> #include<string.h> #include <netinet/in.h> #include <arpa/inet.h> int main(void) { int sockid,newsockid; socklen_t addr_size; char *msg="What a beautiful morning!"; int len, bytes_sent; sockid=socket(AF_INET,SOCK_STREAM,0); if(sockid==-1) { perror("socket"); exit(1); } else printf("created"); struct sockaddr_in serveraddr,clientaddr; bzero((char *)&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(7400); serveraddr.sin_addr.s_addr=INADDR_ANY; if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0) { perror("bind"); return -1; } listen(sockid,5); addr_size=sizeof(clientaddr); newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size); len = strlen(msg); bytes_sent = send(sockid, msg, len, 0); close(sockid); } 

Client code:

 #include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include <errno.h> #include<string.h> #include <netinet/in.h> #include <arpa/inet.h> int main(void) { int byte_count; struct sockaddr_in serveraddr; char *servername; char buf[256]; socklen_t addr_size; int sockfd; sockfd=socket(AF_INET,SOCK_STREAM,0); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(11378); servername=gethostbyname("localhost"); inet_pton(AF_INET,servername,&serveraddr.sin_addr); addr_size=sizeof(serveraddr); if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1) { perror("connect"); exit(1); } byte_count = recv(sockfd, buf, sizeof buf, 0); printf("recv()'d %d bytes of data in buf\n", byte_count); close(sockfd); } 

Early help will be appreciated. Thanks.

+4
source share
4 answers
 sockfd=socket(AF_INET,SOCK_STREAM,0); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_port=htons(7400); inet_pton(AF_INET,servername,&serveraddr.sin_addr); // here 

You pass servername to inet_pton() but not initialized! Therefore, inet_pton() will fail. You should check its return value.

 servername=gethostbyname(); //here addr_size=sizeof(serveraddr); 

The second problem is that you are not using gethostbyname() correctly. Look at the manpage , you will see that gethostbyname() takes arguments and returns a pointer to struct hostent , not a pointer to char , as you did. Your compiler does not warn you about this because you are not including netdb.h .

You should check the return values ​​of all the functions you use and avoid such problems. You should enable some flags of your compiler (for example, alc said in the question comments, -W -Wextra -Wall -pedantic are really great flags).

+3
source

check port. server port is 7400, but the client is trying to connect to port number 11378, so only the connection was refused.

+3
source

Be sure to include errno.h in your program.
Add the line printf("%s", strerr(errno)); into your program after any failure. Any system call failure sets errno to the correct value, which makes diagnosing the problem easier.

+1
source

Well, you need to be sure that your server is up and listening on the appropriate port (7400). Just check: "netstat -tanp" if there is something listening on port 7400, and then try connecting.

0
source

Source: https://habr.com/ru/post/1499395/


All Articles