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