The contents of this page are licensed under the following license
BSD Sockets
UDP 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; int nBind; int nTmp; struct sockaddr_in stServerAddr, stMyAddr; 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_DGRAM, 0); if (nSocket < 0) { fprintf(stderr, "%s: Can't create a socket.\n", argv[0]); exit(1); } /* client info */ memset(&stMyAddr, 0, sizeof(struct sockaddr)); stMyAddr.sin_family = AF_INET; stMyAddr.sin_addr.s_addr = INADDR_ANY; stMyAddr.sin_port = 0; /* 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])); /* bind client name to a socket */ nBind = bind(nSocket, (struct sockaddr*)&stMyAddr, sizeof(struct sockaddr)); if (nBind < 0) { fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]); exit(1); } /* send a data to a server */ strcpy(cbBuf, "Hello server!\n"); sendto(nSocket, cbBuf, strlen(cbBuf)+1, 0, (struct sockaddr*)&stServerAddr, sizeof(struct sockaddr)); /* receive a data from a server */ nTmp = sizeof(struct sockaddr); nBytes = recvfrom(nSocket, cbBuf, BUF_SIZE, 0, (struct sockaddr*)&stServerAddr, &nTmp); printf("%s:: %s", argv[0], cbBuf); close(nSocket); return 0; } |
UDP 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 #define BUF_SIZE 1024 int main(int argc, char* argv[]) { int nSocket; int nBind; int nFoo = 1, nTmp; struct sockaddr_in stMyAddr, stClientAddr; char cbBuf[BUF_SIZE]; /* address structure */ memset(&stMyAddr, 0, sizeof(struct sockaddr)); stMyAddr.sin_family = AF_INET; stMyAddr.sin_addr.s_addr = htonl(INADDR_ANY); stMyAddr.sin_port = htons(SERVER_PORT); /* create a socket */ nSocket = socket(AF_INET, SOCK_DGRAM, 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*)&stMyAddr, sizeof(struct sockaddr)); if (nBind < 0) { fprintf(stderr, "%s: Can't bind a name to a socket.\n", argv[0]); exit(1); } while(1) { /* receive a data from a client */ nTmp = sizeof(struct sockaddr); recvfrom(nSocket,cbBuf, BUF_SIZE, 0, (struct sockaddr*)&stClientAddr, &nTmp); printf("%s:: %s", argv[0], cbBuf); /* send a data to a client */ strcpy(cbBuf, "Hello client!\n"); sendto(nSocket, cbBuf, strlen(cbBuf)+1, 0, (struct sockaddr*)&stClientAddr, nTmp); } close(nSocket); return(0); } |
August, 23rd 2006 © Michał Kalewski