The following is an example of the simplest client/server program to learn the socket API.
The function of the ECHOSER.C program is to read the characters from the client and then go back directly.
/************************************************************************* > File name:echoser.c > Author: Simba > Mail:dameng34@163.com > Created time:fri Mar 2013 06:15:27 PM CST *************************** /#include <stdio.h> #include <sys/types.h> #include < sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <arpa/inet.h
> #include <netinet/in.h> #include <string.h> #define ERR_EXIT (m) \ Do {\ perror (m); Exit (Exit_failure); \} while (0) int main (void) {int listenfd;//passive socket (file descriptor), that is, can only accept if (LISTENFD = socket (pf_ine T, Sock_stream, ipproto_tcp)) < 0)//LISTENFD = socket (af_inet, sock_stream, 0) err_exit ("Socket Erro
R ");
struct sockaddr_in servaddr;
memset (&servaddr, 0, sizeof (SERVADDR));
servaddr.sin_family = af_inet; ServadDr.sin_port = htons (5188);
SERVADDR.SIN_ADDR.S_ADDR = htonl (Inaddr_any); /* servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1"); * * * Inet_aton ("127.0.0.1", &servaddr.sin_addr);
*/int on = 1;
if (setsockopt (LISTENFD, Sol_socket, so_reuseaddr, &on, sizeof (ON)) < 0) err_exit ("setsockopt error");
if (Bind (LISTENFD, (struct sockaddr *) &servaddr, sizeof (SERVADDR)) < 0) Err_exit ("Bind error");
if (Listen (LISTENFD, Somaxconn) < 0)//listen should be after the socket and bind, but before accept ("Err_exit error"); struct sockaddr_in peeraddr; Outgoing parameter socklen_t peerlen = sizeof (PEERADDR); Incoming outgoing parameter must have an initial value of int conn;
Socket connected (to active socket, or active Connect) if ((conn = Accept (LISTENFD, (struct sockaddr *) &peeraddr, &peerlen)) < 0)
Err_exit ("Accept error");
printf ("Recv Connect ip=%s port=%d\n", Inet_ntoa (PEERADDR.SIN_ADDR), Ntohs (Peeraddr.sin_port));
Char recvbuf[1024]; While(1) {memset (recvbuf, 0, sizeof (RECVBUF));
int ret = READ (conn, recvbuf, sizeof (RECVBUF));
Fputs (Recvbuf, stdout);
Write (conn, recvbuf, ret);
Close (conn);
Close (LISTENFD);
return 0; }