Unix Socket - Quick Guide
Unix Socket - Quick Guide
Previous Page
Next Page
What is a Socket?
Sockets allow communication between two different processes on the same or different machines.
To be more precise, it's a way to talk to other computers using standard Unix file descriptors. In Unix,
every I/O action is done by writing or reading a file descriptor. A file descriptor is just an integer
associated with an open file and it can be a network connection, a text file, a terminal, or something
else.
To a programmer, a socket looks and behaves much like a low-level file descriptor. This is because
commands such as read() and write() work with sockets in the same way they do with files and pipes.
Sockets were first introduced in 2.1BSD and subsequently refined into their current form with 4.2BSD.
The sockets feature is now available with most current UNIX system releases.
Socket Types
There are four types of sockets available to the users. The first two are most commonly used and the
last two are rarely used.
Processes are presumed to communicate only between sockets of the same type but there is no
restriction that prevents communication between sockets of different types.
Raw Sockets − These provide users access to the underlying communication protocols,
which support socket abstractions. These sockets are normally datagram oriented, though
their exact characteristics are dependent on the interface provided by the protocol. Raw
sockets are not intended for the general user; they have been provided mainly for those
interested in developing new communication protocols, or for gaining access to some of the
more cryptic facilities of an existing protocol.
Sequenced Packet Sockets − They are similar to a stream socket, with the exception that
record boundaries are preserved. This interface is provided only as a part of the Network
Systems (NS) socket abstraction, and is very important in most serious NS applications.
Sequenced-packet sockets allow the user to manipulate the Sequence Packet Protocol (SPP)
or Internet Datagram Protocol (IDP) headers on a packet or a group of packets, either by
writing a prototype header along with whatever data is to be sent, or by specifying a default
header to be used with all outgoing data, and allows the user to receive the headers on
incoming packets.
What is Next?
The next few chapters are meant to strengthen your basics and prepare a foundation before you can
write Server and Client programs using socket. If you directly want to jump to see how to write a client
and server program, then you can do so but it is not recommended. It is strongly recommended that
you go step by step and complete these initial few chapters to make your base before moving on to
do programming.
The IP host address, or more commonly just IP address, is used to identify hosts connected to the
Internet. IP stands for Internet Protocol and refers to the Internet Layer of the overall network
architecture of the Internet.
An IP address is a 32-bit quantity interpreted as four 8-bit numbers or octets. Each IP address
uniquely identifies the participating user network, the host on the network, and the class of the user
network.
An IP address is usually written in a dotted-decimal notation of the form N1.N2.N3.N4, where each
Ni is a decimal number between 0 and 255 decimal (00 through FF hexadecimal).
Address Classes
IP addresses are managed and created by the Internet Assigned Numbers Authority (IANA). There
are five different address classes. You can determine which class an IP address is in by examining
the first four bits of the IP address.
Class A addresses begin with 0xxx, or 1 to 126 decimal.
Addresses beginning with 01111111, or 127 decimal, are reserved for loopback and for internal
testing on a local machine [You can test this: you should always be able to ping 127.0.0.1, which
points to yourself]; Class D addresses are reserved for multicasting; Class E addresses are reserved
for future use. They should not be used for host addresses.
Example
Class Leftmost bits Start address Finish address
Subnetting
Subnetting or subnetworking basically means to branch off a network. It can be done for a variety of
reasons like network in an organization, use of different physical media (such as Ethernet, FDDI,
WAN, etc.), preservation of address space, and security. The most common reason is to control
network traffic.
The basic idea in subnetting is to partition the host identifier portion of the IP address into two parts
−
A subnet address within the network address itself; and
For example, a common Class B address format is N1.N2.S.H, where N1.N2 identifies the Class B
network, the 8-bit S field identifies the subnet, and the 8-bit H field identifies the host on the subnet.
The process of finding out dotted IP address based on the given alphanumeric host name is known
as hostname resolution.
A hostname resolution is done by special software residing on high-capacity systems. These systems
are called Domain Name Systems (DNS), which keep the mapping of IP addresses and the
corresponding ordinary names.
Note that more than one name may be associated with a given IP address. This file is used while
converting from IP address to host name and vice versa.
You would not have access to edit this file, so if you want to put any host name along with IP address,
then you would need to have root permission.
Client Process
This is the process, which typically makes a request for information. After getting the response, this
process may terminate or may do some other processing.
Example, Internet Browser works as a client application, which sends a request to the Web Server
to get one HTML webpage.
Server Process
This is the process which takes a request from the clients. After getting a request from the client, this
process will perform the required processing, gather the requested information, and send it to the
requestor client. Once done, it becomes ready to serve another client. Server processes are always
alert and ready to serve incoming requests.
Example − Web Server keeps waiting for requests from Internet Browsers and as soon as it gets any
request from a browser, it picks up a requested HTML page and sends it back to that Browser.
Note that the client needs to know the address of the server, but the server does not need to know
the address or even the existence of the client prior to the connection being established. Once a
connection is established, both sides can send and receive information.
2-tier architecture − In this architecture, the client directly interacts with the server. This type
of architecture may have some security holes and performance problems. Internet Explorer
and Web Server work on two-tier architecture. Here security problems are resolved using
Secure Socket Layer (SSL).
3-tier architectures − In this architecture, one more software sits in between the client and
the server. This middle software is called ‘middleware’. Middleware are used to perform all
the security checks and load balancing in case of heavy load. A middleware takes all requests
from the client and after performing the required authentication, it passes that request to the
server. Then the server does the required processing and sends the response back to the
middleware and finally the middleware passes this response back to the client. If you want to
implement a 3-tier architecture, then you can keep any middleware like Web Logic or
WebSphere software in between your Web Server and Web Browser.
Types of Server
There are two types of servers you can have −
Iterative Server − This is the simplest form of server where a server process serves one client
and after completing the first request, it takes request from another client. Meanwhile, another
client keeps waiting.
Concurrent Servers − This type of server runs multiple concurrent processes to serve many
requests at a time because one process may take longer and another client cannot wait for
so long. The simplest way to write a concurrent server under Unix is to fork a child process
to handle each client separately.
The steps involved in establishing a socket on the client side are as follows −
Connect the socket to the address of the server using the connect()system call.
Send and receive data. There are a number of ways to do this, but the simplest way is to use
the read() and write() system calls.
Bind the socket to an address using the bind() system call. For a server socket on the Internet,
an address consists of a port number on the host machine.
Accept a connection with the accept() system call. This call typically blocks the connection
until a client connects with the server.
Send and receive data using the read() and write() system calls.
sockaddr
The first structure is sockaddr that holds the socket information −
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
This is a generic socket address structure, which will be passed in most of the socket function calls.
The following table provides a description of the member fields −
AF_NS
AF_IMPLINK
sa_data Protocol-specific The content of the 14 bytes of protocol specific address are
Address interpreted according to the type of address. For the Internet
family, we will use port number IP address, which is represented
by sockaddr_in structure defined below.
sockaddr in
The second structure that helps you to reference to the socket's elements is as follows −
struct sockaddr_in {
};
AF_NS
AF_IMPLINK
sin_zero Not Used You just set this value to NULL as this is not being used.
in addr
This structure is used only in the above structure as a structure field and holds 32 bit netid/hostid.
struct in_addr {
};
hostent
This structure is used to keep information related to host.
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list
};
h_name ti.com It is the official name of the host. For example, tutorialspoint.com,
etc. google.com, etc.
h_addrtype AF_INET It contains the address family and in case of Internet based application,
it will always be AF_INET.
h_length 4 It holds the length of the IP address, which is 4 for Internet Address.
servent
This particular structure is used to keep information related to service and associated ports.
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
Here is the description of the member fields −
s_name http This is the official name of the service. For example, SMTP, FTP POP3, etc.
s_aliases ALIAS It holds the list of service aliases. Most of the time this will be set to NULL.
s_port 80 It will have associated port number. For example, for HTTP, this will be 80.
s_proto TCP It is set to the protocol used. Internet services are provided using either TCP
or UDP.
UDP
We always pass these structures by reference (i.e., we pass a pointer to the structure, not the
structure itself), and we always pass the size of the structure as another argument.
When a socket function fills in a structure, the length is also passed by reference, so that its value
can be updated by the function. We call these value-result arguments.
Always, set the structure variables to NULL (i.e., '\0') by using memset() for bzero() functions,
otherwise it may get unexpected junk values in your structure.
To resolve the problem of identifying a particular server process running on a host, both TCP and
UDP have defined a group of well-known ports.
For our purpose, a port will be defined as an integer number between 1024 and 65535. This is
because all port numbers smaller than 1024 are considered well-known -- for example, telnet uses
port 23, http uses 80, ftp uses 21, and so on.
The port assignments to network services can be found in the file /etc/services. If you are writing your
own server then care must be taken to assign a port to your server. You should make sure that this
port should not be assigned to any other server.
Normally it is a practice to assign any port number more than 5000. But there are many organizations
who have written servers having port numbers more than 5000. For example, Yahoo Messenger runs
on 5050, SIP Server runs on 5060, etc.
struct servent *getservbyname(char *name, char *proto) − This call takes service name
and protocol name, and returns the corresponding port number for that service.
struct servent *getservbyport(int port, char *proto) − This call takes port number and
protocol name, and returns the corresponding service name.
The return value for each function is a pointer to a structure with the following form −
struct servent {
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
s_aliases ALIAS It holds the list of service aliases. Most of the time, it will be set to NULL.
s_port 80 It will have the associated port number. For example, for HTTP, it will be 80.
s_proto TCP It is set to the protocol used. Internet services are provided using either TCP
or UDP.
UDP
Little Endian − In this scheme, low-order byte is stored on the starting address (A) and high-
order byte is stored on the next address (A + 1).
Big Endian − In this scheme, high-order byte is stored on the starting address (A) and low-
order byte is stored on the next address (A + 1).
To allow machines with different byte order conventions communicate with each other, the Internet
protocols specify a canonical byte order convention for data transmitted over the network. This is
known as Network Byte Order.
While establishing an Internet socket connection, you must make sure that the data in the sin_port
and sin_addr members of the sockaddr_in structure are represented in Network Byte Order.
Function Description
unsigned short htons(unsigned short hostshort) − This function converts 16-bit (2-byte)
quantities from host byte order to network byte order.
unsigned long htonl(unsigned long hostlong) − This function converts 32-bit (4-byte)
quantities from host byte order to network byte order.
unsigned short ntohs(unsigned short netshort) − This function converts 16-bit (2-byte)
quantities from network byte order to host byte order.
unsigned long ntohl(unsigned long netlong) − This function converts 32-bit quantities from
network byte order to host byte order.
These functions are macros and result in the insertion of conversion source code into the calling
program. On little-endian machines, the code will change the values around to network byte order.
On big-endian machines, no code is inserted since none is needed; the functions are defined as null.
In this example, we store the two-byte value 0x0102 in the short integer and then look at the two
consecutive bytes, c[0] (the address A) and c[1] (the address A + 1) to determine the byte order.
#include <stdio.h>
union {
short s;
char c[sizeof(short)];
}un;
un.s = 0x0102;
if (sizeof(short) == 2) {
printf("big-endian\n");
printf("little-endian\n");
else
printf("unknown\n");
else {
exit(0);
The following three function calls are used for IPv4 addressing −
#include <arpa/inet.h>
(...)
int retval;
(...)
#include <arpa/inet.h>
(...)
struct sockaddr_in dest;
dest.sin_addr.s_addr = inet_addr("68.178.157.132");
(...)
#include <arpa/inet.h>
(...)
char *ip;
ip = inet_ntoa(dest.sin_addr);
(...)
The following diagram shows the complete Client and Server interaction −
The socket Function
To perform network I/O, the first thing a process must do is, call the socket function, specifying the
type of communication protocol desired and protocol family, etc.
#include <sys/types.h>
#include <sys/socket.h>
Parameters
family − It specifies the protocol family and is one of the constants shown below −
Family Description
type − It specifies the kind of socket you want. It can take one of the following values −
Type Description
protocol − The argument should be set to the specific protocol type given below, or 0 to select the
system's default for the given combination of family and type −
Protocol Description
#include <sys/types.h>
#include <sys/socket.h>
This call returns 0 if it successfully connects to the server, otherwise it returns -1 on error.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
serv_addr − It is a pointer to struct sockaddr that contains destination IP address and port.
#include <sys/types.h>
#include <sys/socket.h>
Parameters
sockfd − It is a socket descriptor returned by the socket function.
my_addr − It is a pointer to struct sockaddr that contains the local IP address and port.
A 0 value for port number means that the system will choose a random port, and INADDR_ANY value
for IP address means the server's IP address will be assigned automatically.
server.sin_port = 0;
server.sin_addr.s_addr = INADDR_ANY;
NOTE − All ports below 1024 are reserved. You can set a port above 1024 and below 65535 unless
they are the ones being used by other programs.
The listen function converts an unconnected socket into a passive socket, indicating that the
kernel should accept incoming connection requests directed to this socket.
The second argument to this function specifies the maximum number of connections the
kernel should queue for this socket.
#include <sys/types.h>
#include <sys/socket.h>
Parameters
sockfd − It is a socket descriptor returned by the socket function.
#include <sys/types.h>
#include <sys/socket.h>
This call returns a non-negative descriptor on success, otherwise it returns -1 on error. The returned
descriptor is assumed to be a client socket descriptor and all read-write operations will be done on
this descriptor to communicate with the client.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
cliaddr − It is a pointer to struct sockaddr that contains client IP address and port.
You can use write() system call to send data. Its signature is as follows −
int send(int sockfd, const void *msg, int len, int flags);
This call returns the number of bytes sent out, otherwise it will return -1 on error.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
len − It is the length of the data you want to send (in bytes).
flags − It is set to 0.
You can use read() system call to read the data. This call is explained in helper functions chapter.
int recv(int sockfd, void *buf, int len, unsigned int flags);
This call returns the number of bytes read into the buffer, otherwise it will return -1 on error.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
flags − It is set to 0.
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr
*to, int tolen);
This call returns the number of bytes sent, otherwise it returns -1 on error.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
len − It is the length of the data you want to send (in bytes).
flags − It is set to 0.
to − It is a pointer to struct sockaddr for the host where data has to be sent.
int recvfrom(int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int
*fromlen);
This call returns the number of bytes read into the buffer, otherwise it returns -1 on error.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
flags − It is set to 0.
from − It is a pointer to struct sockaddr for the host where data has to be read.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
Parameters
sockfd − It is a socket descriptor returned by the socket function.
o 2 − indicates that both sending and receiving are not allowed. When how is set to 2,
it's the same thing as close().
Calling recv or recvfrom on a socket that has no data in its input queue prevents immediate reception
of data from other sockets. The select function call solves this problem by allowing the program to
poll all the socket handles to see if they are available for non-blocking reading and writing operations.
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval
*timeout);
Parameters
nfds − It specifies the range of file descriptors to be tested. The select() function tests file
descriptors in the range of 0 to nfds-1
readfds − It points to an object of type fd_set that on input, specifies the file descriptors to be
checked for being ready to read, and on output, indicates which file descriptors are ready to
read. It can be NULL to indicate an empty set.
writefds − It points to an object of type fd_set that on input, specifies the file descriptors to be
checked for being ready to write, and on output, indicates which file descriptors are ready to
write. It can be NULL to indicate an empty set.
exceptfds − It points to an object of type fd_set that on input, specifies the file descriptors to
be checked for error conditions pending, and on output indicates, which file descriptors have
error conditions pending. It can be NULL to indicate an empty set.
timeout − It points to a timeval struct that specifies how long the select call should poll the
descriptors for an available I/O operation. If the timeout value is 0, then select will return
immediately. If the timeout argument is NULL, then select will block until at least one
file/socket handle is ready for an available I/O operation. Otherwise select will return after the
amount of time in the timeout has elapsed OR when at least one file/socket descriptor is ready
for an I/O operation.
The return value from select is the number of handles specified in the file descriptor sets that are
ready for I/O. If the time limit specified by the timeout field is reached, select return 0. The following
macros exist for manipulating a file descriptor set −
FD_CLR(fd, &fdset) − Clears the bit for the file descriptor fd in the file descriptor set fdset.
FD_ISSET(fd, &fdset) − Returns a non-zero value if the bit for the file descriptor fd is set in
the file descriptor set pointed to by fdset, and 0 otherwise.
FD_SET(fd, &fdset) − Sets the bit for the file descriptor fd in the file descriptor set fdset.
FD_ZERO(&fdset) − Initializes the file descriptor set fdset to have zero bits for all file
descriptors.
The behavior of these macros is undefined if the fd argument is less than 0 or greater than or equal
to FD_SETSIZE.
Example
fd_set fds;
tv.tv_sec = 1;
tv.tv_usec = 500000;
FD_ZERO(&fds);
FD_SET(sock, &fds);
/* wait 1.5 seconds for any data to be read from any single socket */
if (FD_ISSET(sock, &fds)) {
/* do something */
}
else {
/* do something else */
You can also use send() function to send data to another process.
#include <unistd.h>
Upon successful completion, write() returns the number of bytes actually written to the file associated
with fildes. This number is never greater than nbyte. Otherwise, -1 is returned.
Parameters
fildes − It is a socket descriptor returned by the socket function.
nbyte − It is the number of bytes to be written. If nbyte is 0, write() will return 0 and have no
other results if the file is a regular file; otherwise, the results are unspecified.
You can also use recv() function to read data to another process.
#include <unistd.h>
int read(int fildes, const void *buf, int nbyte);
Upon successful completion, write() returns the number of bytes actually written to the file associated
with fildes. This number is never greater than nbyte. Otherwise, -1 is returned.
Parameters
fildes − It is a socket descriptor returned by the socket function.
#include <sys/types.h>
#include <unistd.h>
int fork(void);
Upon successful completion, fork() returns 0 to the child process and the process ID of the child
process to the parent process. Otherwise -1 is returned to the parent process, no child process is
created and errno is set to indicate the error.
Parameters
void − It means no parameter is required.
Parameters
s − It specifies the string which has to be filled with null bytes. This will be a point to socket
structure variable.
nbyte − It specifies the number of bytes to be filled with null values. This will be the size of
the socket structure.
This function returns 0 if both strings are identical, 1 otherwise. The bcmp() function always returns
0 when nbyte is 0.
Parameters
s1 − It specifies the first string to be compared.
Parameters
s1 − It specifies the source string.
Parameters
s − It specifies the source to be set.
Bind the socket to an address using the bind() system call. For a server socket on the Internet,
an address consists of a port number on the host machine.
Accept a connection with the accept() system call. This call typically blocks until a client
connects with the server.
Send and receive data using the read() and write() system calls.
Now let us put these steps in the form of source code. Put this code into the file server.c and compile
it with gcc compiler.
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
int n;
if (sockfd < 0) {
exit(1);
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
perror("ERROR on binding");
exit(1);
listen(sockfd,5);
clilen = sizeof(cli_addr);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
bzero(buffer,256);
n = read( newsockfd,buffer,255 );
if (n < 0) {
exit(1);
if (n < 0) {
perror("ERROR writing to socket");
exit(1);
return 0;
Put the accept statement and the following code in an infinite loop.
The child process will close sockfd and call doprocessing function, passing the new socket
file descriptor as an argument. When the two processes have completed their conversation,
as indicated by doprocessing() returning, this process simply exits.
The parent process closes newsockfd. As all of this code is in an infinite loop, it will return to
the accept statement to wait for the next connection.
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
int n, pid;
if (sockfd < 0) {
exit(1);
portno = 5001;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
perror("ERROR on binding");
exit(1);
*/
listen(sockfd,5);
clilen = sizeof(cli_addr);
while (1) {
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
pid = fork();
if (pid < 0) {
perror("ERROR on fork");
exit(1);
if (pid == 0) {
close(sockfd);
doprocessing(newsockfd);
exit(0);
}
else {
close(newsockfd);
} /* end of while */
int n;
char buffer[256];
bzero(buffer,256);
n = read(sock,buffer,255);
if (n < 0) {
exit(1);
if (n < 0) {
exit(1);
}
Unix Socket - Client Examples
To make a process a TCP client, you need to follow the steps given below &minus ;
Connect the socket to the address of the server using the connect()system call.
Send and receive data. There are a number of ways to do this, but the simplest way is to use
the read() and write() system calls.
Now let us put these steps in the form of source code. Put this code into the file client.c and compile
it with gcc compiler.
Run this program and pass hostname and port number of the server, to connect to the server, which
you already must have run in another Unix window.
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
char buffer[256];
if (argc < 3) {
exit(0);
}
portno = atoi(argv[2]);
if (sockfd < 0) {
exit(1);
server = gethostbyname(argv[1]);
if (server == NULL) {
exit(0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
perror("ERROR connecting");
exit(1);
*/
bzero(buffer,256);
fgets(buffer,255,stdin);
if (n < 0) {
exit(1);
bzero(buffer,256);
if (n < 0) {
exit(1);
}
printf("%s\n",buffer);
return 0;
struct servent *getservbyname(char *name, char *proto) − This call takes a service name
and a protocol name and returns the corresponding port number for that service.
struct servent *getservbyport(int port, char *proto) − This call takes a port number and a
protocol name and returns the corresponding service name.
unsigned long htonl (unsigned long hostlong) − This function converts 32-bit (4-byte)
quantities from host byte order to network byte order.
unsigned short ntohs (unsigned short netshort) − This function converts 16-bit (2-byte)
quantities from network byte order to host byte order.
unsigned long ntohl (unsigned long netlong) − This function converts 32-bit quantities
from network byte order to host byte order.
IP Address Functions
int inet_aton (const char *strptr, struct in_addr *addrptr) − This function call converts the
specified string, in the Internet standard dot notation, to a network address, and stores the
address in the structure provided. The converted address will be in Network Byte Order (bytes
ordered from left to right). It returns 1 if the string is valid and 0 on error.
in_addr_t inet_addr (const char *strptr) − This function call converts the specified string, in
the Internet standard dot notation, to an integer value suitable for use as an Internet address.
The converted address will be in Network Byte Order (bytes ordered from left to right). It
returns a 32-bit binary network byte ordered IPv4 address and INADDR_NONE on error.
char *inet_ntoa (struct in_addr inaddr) − This function call converts the specified Internet
host address to a string in the Internet standard dot notation.
int connect (int sockfd, struct sockaddr *serv_addr, int addrlen) − The connect function
is used by a TCP client to establish a connection with a TCP server. This call returns 0 if it
successfully connects to the server, otherwise it returns -1.
int bind(int sockfd, struct sockaddr *my_addr,int addrlen) − The bind function assigns a
local protocol address to a socket. This call returns 0 if it successfully binds to the address,
otherwise it returns -1.
int listen(int sockfd, int backlog) − The listen function is called only by a TCP server to listen
for the client request. This call returns 0 on success, otherwise it returns -1.
int accept (int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen) − The accept function
is called by a TCP server to accept client requests and to establish actual connection. This
call returns a non-negative descriptor on success, otherwise it returns -1.
int send(int sockfd, const void *msg, int len, int flags) − The send function is used to send
data over stream sockets or CONNECTED datagram sockets. This call returns the number
of bytes sent out, otherwise it returns -1.
int recv (int sockfd, void *buf, int len, unsigned int flags) − The recv function is used to
receive data over stream sockets or CONNECTED datagram sockets. This call returns the
number of bytes read into the buffer, otherwise it returns -1 on error.
int sendto (int sockfd, const void *msg, int len, unsigned int flags, const struct
sockaddr *to, int tolen) − The sendto function is used to send data over UNCONNECTED
datagram sockets. This call returns the number of bytes sent, otherwise it returns -1 on error.
int recvfrom (int sockfd, void *buf, int len, unsigned int flags struct sockaddr *from, int
*fromlen) − The recvfrom function is used to receive data from UNCONNECTED datagram
sockets. This call returns the number of bytes read into the buffer, otherwise it returns -1 on
error.
int close (int sockfd) − The close function is used to close a communication between the
client and the server. This call returns 0 on success, otherwise it returns -1.
int shutdown (int sockfd, int how) − The shutdown function is used to gracefully close a
communication between the client and the server. This function gives more control in
comparison to close function. It returns 0 on success, -1 otherwise.
int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval
*timeout) − This function is used to read or write multiple sockets.
int read (int fildes, const void *buf, int nbyte) − The read function attempts to read nbyte
bytes from the file associated with the open file descriptor, fildes, into the buffer pointed to by
buf. Upon successful completion, write() returns the number of bytes actually written to the
file associated with fildes. This number is never greater than nbyte. Otherwise, -1 is returned.
int fork (void) − The fork function creates a new process. The new process, called the child
process, will be an exact copy of the calling process (parent process).
void bzero (void *s, int nbyte) − The bzero function places nbyte null bytes in the string s.
This function will be used to set all the socket structures with null values.
int bcmp (const void *s1, const void *s2, int nbyte) − The bcmp function compares the
byte string s1 against the byte string s2. Both the strings are assumed to be nbyte bytes long.
void bcopy (const void *s1, void *s2, int nbyte) − The bcopy function copies nbyte bytes
from the string s1 to the string s2. Overlapping strings are handled correctly.
void *memset(void *s, int c, int nbyte) − The memset function is also used to set structure
variables in the same way as bzero.
Previous Page
Print
Next Page
Advertisements