C Language TCP Socket EchoServer&Client Sample Source
C Socket EchoServer
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#define MAX_CONNECTIONS 100
int create_tcp_server_socket(int port) {
struct sockaddr_in saddr;
int fd, ret_val;
/* Step1: create a TCP socket */
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == -1) {
fprintf(stderr, "socket failed [%s]\n", strerror(errno));
return -1;
}
printf("Created a socket with fd: %d\n", fd);
/* Initialize the socket address structure */
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = INADDR_ANY;
/* Step2: bind the socket to port 7000 on the local host */
ret_val = bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));
if (ret_val != 0) {
fprintf(stderr, "bind failed [%s]\n", strerror(errno));
close(fd);
return -1;
}
/* Step3: listen for incoming connections */
ret_val = listen(fd, 5);
if (ret_val != 0) {
fprintf(stderr, "listen failed [%s]\n", strerror(errno));
close(fd);
return -1;
}
return fd;
}
int main (int argc, char* argv[]) {
fd_set read_fd_set;
struct sockaddr_in new_addr;
int server_fd, new_fd, ret_val, i, len, bytesRead;
int port = atoi(argv[1]);
socklen_t addrlen;
char buf[DATA_BUFFER];
char length[8];
int all_connections[MAX_CONNECTIONS];
/* Get the socket server fd */
server_fd = create_tcp_server_socket(port);
if (server_fd == -1) {
fprintf(stderr, "Failed to create a server\n");
return -1;
}
/* Initialize all_connections and set the first entry to server fd */
for (i=0;i < MAX_CONNECTIONS;i++) {
all_connections[i] = -1;
}
all_connections[0] = server_fd;
while (1) {
FD_ZERO(&read_fd_set);
/* Set the fd_set before passing it to the select call */
for (i=0;i < MAX_CONNECTIONS;i++) {
if (all_connections[i] >= 0) {
FD_SET(all_connections[i], &read_fd_set);
}
}
struct timeval readWait;
readWait.tv_sec = 10;
readWait.tv_usec = 0;
/* Invoke select() and then wait! */
printf("\nUsing select() to listen for incoming events\n");
ret_val = select(FD_SETSIZE, &read_fd_set, (fd_set *)0,(fd_set *)0,&readWait);
/* select() woke up. Identify the fd that has events */
if (ret_val >= 0 ) {
printf("Select returned with %d\n", ret_val);
/* Check if the fd with event is the server fd */
if (FD_ISSET(server_fd, &read_fd_set)) {
/* accept the new connection */
printf("Returned fd is %d (server's fd)\n", server_fd);
new_fd = accept(server_fd, (struct sockaddr*)&new_addr, &addrlen);
if (new_fd >= 0) {
printf("Accepted a new connection with fd: %d\n", new_fd);
for (i=0;i < MAX_CONNECTIONS;i++) {
if (all_connections[i] < 0) {
all_connections[i] = new_fd;
break;
}
}
} else {
fprintf(stderr, "accept failed [%s]\n", strerror(errno));
}
ret_val--;
if (!ret_val) continue;
}
/* Check if the fd with event is a non-server fd */
for (i=1;i < MAX_CONNECTIONS;i++) {
bytesRead = 0;
if ((all_connections[i] > 0) &&
(FD_ISSET(all_connections[i], &read_fd_set))) {
/* read incoming data */
printf("Returned fd is %d [index, i: %d]\n", all_connections[i], i);
ret_val = recv(all_connections[i], length, 8, 0);
len = atoi(length);
char buf[len+8];
memcpy(buf, length, 8);
bytesRead+=ret_val;
if (ret_val == 0) {
printf("Closing connection for fd:%d\n", all_connections[i]);
close(all_connections[i]);
all_connections[i] = -1; /* Connection is now closed */
}
if (ret_val > 0) {
printf("Successfully Length data (len %d bytes, fd: %d): %s\n", ret_val, all_connections[i], buf);
while(len != bytesRead-8) {
ret_val = recv(all_connections[i], buf+bytesRead, len-(bytesRead-8), 0);
if(ret_val <= 0) {
break;
}
else
bytesRead+=ret_val;
}
printf("Successfully Received data (len %d bytes, fd: %d): %s\n", bytesRead, all_connections[i], buf);
memcpy(buf+159, "R", 1);
write(all_connections[i], buf, bytesRead);
printf("Successfully Send data (len %d bytes, fd: %d): %s\n", bytesRead, all_connections[i], buf);
}
if (ret_val == -1) {
printf("recv() failed for fd: %d [%s]\n",
all_connections[i], strerror(errno));
break;
}
}
ret_val--;
if (!ret_val) continue;
} /* for-loop */
} /* (ret_val >= 0) */
} /* while(1) */
/* Last step: Close all the sockets */
for (i=0;i < MAX_CONNECTIONS;i++) {
if (all_connections[i] > 0) {
close(all_connections[i]);
}
}
return 0;
}
C Socket Client
#include <stdio.h>
#include <errno.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netdb.h>
#define DATA_BUFFER "Mona Lisa was painted by Leonardo da Vinci"
int main () {
struct sockaddr_in saddr;
int fd, ret_val;
struct hostent *local_host; /* need netdb.h for this */
/* Step1: create a TCP socket */
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == -1) {
fprintf(stderr, "socket failed [%s]\n", strerror(errno));
return -1;
}
printf("Created a socket with fd: %d\n", fd);
/* Let us initialize the server address structure */
saddr.sin_family = AF_INET;
saddr.sin_port = htons(15000);
local_host = gethostbyname("127.0.0.1");
saddr.sin_addr = *((struct in_addr *)local_host->h_addr);
/* Step2: connect to the TCP server socket */
ret_val = connect(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));
if (ret_val == -1) {
fprintf(stderr, "connect failed [%s]\n", strerror(errno));
close(fd);
return -1;
}
printf("The Socket is now connected...\n");
/* Next step: send some data */
ret_val = send(fd,DATA_BUFFER, sizeof(DATA_BUFFER), 0);
printf("Successfully sent data (len %d bytes): %s\n",
ret_val, DATA_BUFFER);
/* read data */
printf("Receive data start...\n");
char buffer[5000];
int bytesRead = 0, loopCount =0, lastTry, rtrn;
fd_set readyToRead;
struct timeval readWait;
int localloop=0;
readWait.tv_sec = 1;
readWait.tv_usec = 0;
while ( bytesRead != ret_val)
{
FD_ZERO(& readyToRead);
FD_SET(fd,& readyToRead);
rtrn = select(FD_SETSIZE,& readyToRead,(fd_set *)0,(fd_set *)0,&readWait);
if (rtrn!=-1 && FD_ISSET (fd, &readyToRead))
{
lastTry = recv(fd, buffer, ret_val, 0);
if(lastTry > 0)
bytesRead += lastTry;
}
if ( rtrn < 0 )
{
printf("select() return -1\n");
}
else if( rtrn == 0 ) {
printf("select() return 0, loopCount [%d]\n", loopCount);
loopCount++;
}
if(loopCount == 10)
break;
}
printf("Successfully recv data (len %d bytes): %s\n", bytesRead, buffer);
/* Last step: close the socket */
close(fd);
return 0;
}