|
The contents of this page are licensed under the following license
BSD Sockets
TCP Client |
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
int main(int argc, char* argv[])
{
int nSocket;
int nConnect;
int nBytes;
struct sockaddr_in stServerAddr;
struct hostent* lpstServerEnt;
char cbBuf[BUF_SIZE];
if (argc != 3)
{
fprintf(stderr, "Usage: %s server_name port_number\n", argv[0]);
exit(1);
}
/* look up server's IP address */
lpstServerEnt = gethostbyname(argv[1]);
if (! lpstServerEnt)
{
fprintf(stderr, "%s: Can't get the server's IP address.\n", argv[0]);
exit(1);
}
/* create a socket */
nSocket = socket(PF_INET, SOCK_STREAM, 0);
if (nSocket < 0)
{
fprintf(stderr, "%s: Can't create a socket.\n", argv[0]);
exit(1);
}
/* server info */
memset(&stServerAddr, 0, sizeof(struct sockaddr));
stServerAddr.sin_family = AF_INET;
memcpy(&stServerAddr.sin_addr.s_addr, lpstServerEnt->h_addr, lpstServerEnt->h_length);
stServerAddr.sin_port = htons(atoi(argv[2]));
/* connect to the server */
nConnect = connect(nSocket, (struct sockaddr*)&stServerAddr, sizeof(struct sockaddr));
if (nConnect < 0)
{
fprintf(stderr, "%s: Can't connect to the server (%s:%i).\n", argv[0], argv[1], atoi(argv[2]));
exit(1);
}
/* connection is now established; read from socket */
nBytes = read(nSocket, cbBuf, BUF_SIZE);
write(1, cbBuf, nBytes);
close(nSocket);
return 0;
}
|
|
TCP Server |
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SERVER_PORT 1234
#define QUEUE_SIZE 5
void childend(int signo)
{
pid_t pid;
pid = wait(NULL);
printf("\t[end of child process number %d]\n", pid);
}
int main(int argc, char* argv[])
{
int nSocket, nClientSocket;
int nBind, nListen;
int nFoo = 1, nTmp;
struct sockaddr_in stAddr, stClientAddr;
signal(SIGCHLD, childend);
/* address structure */
memset(&stAddr, 0, sizeof(struct sockaddr));
stAddr.sin_family = AF_INET;
stAddr.sin_addr.s_addr = htonl(INADDR_ANY);
stAddr.sin_port = htons(SERVER_PORT);
/* create a socket */
nSocket = socket(AF_INET, SOCK_STREAM, 0);
if (nSocket < 0)
{
fprintf(stderr, "%s: Can't create a socket.\n", argv[0]);
exit(1);
}
setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&nFoo, sizeof(nFoo));
/* bind a name to a socket */
nBind = bind(nSocket, (struct sockaddr*)&stAddr, sizeof(struct sockaddr));
if (nBind < 0)
{
fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]);
exit(1);
}
/* specify queue size */
nListen = listen(nSocket, QUEUE_SIZE);
if (nListen < 0)
{
fprintf(stderr, "%s: Can't set queue size.\n", argv[0]);
}
while(1)
{
/* block for connection request */
nTmp = sizeof(struct sockaddr);
nClientSocket = accept(nSocket, (struct sockaddr*)&stClientAddr, &nTmp);
if (nClientSocket < 0)
{
fprintf(stderr, "%s: Can't create a connection's socket.\n", argv[0]);
exit(1);
}
/* connection */
if (! fork())
{
printf("%s: [connection from %s]\n",
argv[0], inet_ntoa((struct in_addr)stClientAddr.sin_addr));
write(nClientSocket, "Hello World!\n", 13);
close(nClientSocket);
exit(0);
}
}
close(nSocket);
return(0);
}
|
August, 23rd 2006
© Michał Kalewski