Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I am trying to implement socket programming in C. When I try to connect from a client to a server (Ubuntu), it shows an error like "connection failed".

So I think the problem is with the port. I am using the 5454/tcp port for socket programming.

How can I know if 5454 port is listening or not? If it is not, then which are the ports that I can use for TCP socket programming using C in Ubuntu? Is that the problem with port only or is there anything wrong in my code or any settings is required in LINUX Ubuntu?

EDIT: Snippet of code:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

EDIT: Problem is in port, so I just re installed Ubuntu, and it's working. Thank you all of you.

share|improve this question

closed as off-topic by slm, Anthon, rahmu, jasonwryan, Gilles Sep 27 '13 at 21:20

  • This question does not appear to be about Unix or Linux within the scope defined in the help center.
If this question can be reworded to fit the rules in the help center, please edit the question.

    
at first, port 5454 should listen state, Then you connect.second check your firewall. –  Mohsen Pahlevanzadeh Sep 27 '13 at 7:21
    
I always try lsof -i:5454 (you may need to execute it as the same user that the program opening the port does, or as root). –  Carlos Campderrós Sep 27 '13 at 10:31
    
where's the server code (or is the server an existing program) Note that if you want to run a dummy server, nc (netcat) is your friend. –  Foon Sep 27 '13 at 12:00

5 Answers 5

up vote 6 down vote accepted

Since you are programming in C I thought of posting a little snippet which shows you if the port is open or not, I have programmed to output a string. You can easily change it to fit your need.

Answer to your second question, like everyone here said, you can pretty much use any port if you are the super user (root) on the system if the port is not used by any other application. If you are not the root then you can open any port above 1024.

#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> 


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    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) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}
share|improve this answer
    
Excellent! way to check a ports' status using C. –  val0x00ff Sep 27 '13 at 7:55
    
I love the mention "a little snippet" ^^. But +1 for a very informative snippet. –  Olivier Dulac Sep 27 '13 at 8:20

There are several ways, the most common probably being:

# netstat -ltun

You can, of course, grep for other (regular) expression.

If you are using different machines (client and server), you need to check iptables as well.

You can pretty much use any port that's not currently being used for your programs. Check, however, /etc/services for known and reserved ports.

share|improve this answer
    
You can directly list tcp/udp ports in listen state with "netstat -ltun" –  dsmsk80 Sep 27 '13 at 6:41
    
when I used netstat -an | grep LISTEN There it show only two tcp prots and rest of are UDP ports. Now if i want to active 5454 port then how to active? –  dxr Sep 27 '13 at 7:11
    
@dsmsk80 ah, indeed, I guess bad habits die hard. Corrected. –  dawud Sep 27 '13 at 7:18

Check the link(http://wi-fizzle.com/article/458) for TCP port is open or not

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi
share|improve this answer

Use the command:

nmap 192.168.56.101

It will result the number of ports open on that machine along with name of services

share|improve this answer
    
Using anything but nmap for this is beating around the bush IMHO. To check a single port you should use nmap -p5454 192.168.56.101. –  jwg Sep 27 '13 at 11:50
    
This only answers the title but doesn't answer the actual question. –  Steel City Hacker Sep 27 '13 at 11:51
    
Yes. I was just showing the direction. He has to walk to get desired answer. :) –  SHW Sep 30 '13 at 6:34

The best tool for trying to determine if a process is bound to a TCP port is netstat. You can run it like so to get a list of the name of the process that's bound, if any, as well as any connections to the port, as well as their state.

Example

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

The above shows locally opened ports in the 3rd column and remote ports we're willing to accept connections to, such as with these 2 lines:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

These 2 lines show that we're listening on port 22, (sshd) and are willing to accept connections from any interface we have (i.e. any network card, ethernet or wireless). There are currently no connections to this port.

The 2nd line shows that wer're running the CUPS server (for printing) on port 631, and we can only connect to it through the localhost (127.0.0.1) interface.

Further down we have these 2 lines:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

Which show that we're accessing a website at IP address 198.252.206.25. We know it's a website because we're accessing this server through port 80 (HTTP). Also if we look up the IP address we find this:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.